gpt4 book ai didi

C# linq 查询过滤子集合

转载 作者:行者123 更新时间:2023-12-02 14:38:05 28 4
gpt4 key购买 nike

美好的一天,

我有一个如下所示的模型类

    public class EmployeeModel
{
[Key]
public int employeeId{get;set;}
public string Fullname {get;set;}
public string Address{get;set;}
public ICollection<PaymentModel> Payments {get;set;}
}


public class PaymentModel
{

[Key]
public int PaymentId{get; set;}
public int employeeId{get; set;}
public decimal PaymentAmount{get; set;}
public int IsPosted {get; set;}
public virtual EmployeeModel Employee {get; set;}

}

我只想使用 linq 查询员工列表及其付款列表。所以我的代码是这样的:

dbcontext db = new dbcontext();
var listing = from d in db.Employees
.include("Payments")
select d;

此列表显示了所有员工及其所有付款。但我需要过滤 IsPosted = 1 的每个员工付款

因此,作为最初的答案,我将执行此代码;

dbcontext db = new dbcontext();
List<EmployeeModel> FinalList = new List<EmployeeModel>();
var listingofEmp = db.employee.ToList();

foreach(EmployeeModel emp in listingofEmp){
emp.Payments= db.payments.where(x => x.IsPosted == 1).ToList();
FinalList.Add(emp);
}

我的问题是,还有其他更简单的编码方法吗?像这样的东西。

    dbcontext db = new dbcontext();
var listing = from d in db.Employees
.include(d => x.Payments.IsPosted == 1)
select d;

我目前使用的是entityframework 5

我对此进行的研究对我来说不起作用Link

希望有人能帮助我

提前感谢大家

最佳答案

您所要求的内容不受 native 支持,因此没有更简单的方法,但肯定有更有效的方法,因为您当前的代码正在执行 N + 1 数据库查询。

一种更好的方法可能是使用匿名类型投影通过一个数据库查询来检索员工和相关的过滤付款,然后执行类似于您的方法的操作以在内存中创建最终结果。例如:

var listing = 
db.Employees.Select(employee => new
{
employee,
payments = employee.Payments.Where(p => p.IsPosted == 1)
})
.AsEnumerable() // Switch to LINQ to Objects
.Select(r =>
{
r.employee.Payments = r.payments.ToList();
return r.employee;
})
.ToList();

关于C# linq 查询过滤子集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38240502/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com