C# linq 查询过滤器子集合

C# linq query filter child Collection

美好的一天,

我有一个模型 class 如下所示

    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

希望有人能帮助我

提前谢谢大家

这可能是一个不错的选择

var listing = from d in db.Payments
              .include("Employees")
              .where d.IsPosted == 1
               select d.Employees;

(未测试,错误请指正)

从付款开始,过滤器已发布=1 , 那么 select 相关员工

尝试这样的事情:它会给你一个匿名类型的列表,其中包含员工及其付款。

using (dbcontext ctx = new dbcontext())
{
    ctx.Connection.Open();

    var result = (from e in ctx.Employees
                  join p in ctx.Payments on e.employeeId equals p.employeeId
                  where p.IsPosted == 1
                  select new
                  {
                      Employee = e,
                      Payments = p
                  }).ToList();

    ctx.Connection.Close();
}

您要求的内容不受本机支持,因此没有更简单的方法,但肯定有更有效的方法,因为您当前的代码正在执行 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();