C#linq查询过滤器子集合

时间:2016-07-07 08:09:36

标签: c# linq entity-framework-5

美好的一天,

我有一个类似下面的模型类

    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

希望有人能帮助我

先谢谢你们,

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

它是一个很好的选择

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

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

从pyaments开始,过滤器发布= 1 ,然后选择相关的员工

答案 2 :(得分:0)

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

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