繁体   English   中英

C#Linq查询过滤器子级Collection

[英]C# linq query filter child Collection

美好的一天,

我有一个像下面的模型课

    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

我对它不可行的研究链接

希望有人能帮助我

在此先感谢你们

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

它是一个很好的选择

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

(未经测试,请纠正错误)

从p头开始,过滤器已过帐= 1,然后选择相关的员工

尝试这样的事情:它将为您提供一个匿名类型的列表,该列表将保存该员工及其付款。

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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM