C# linq 查询筛选器子集合

本文关键字:子集合 筛选 查询 linq | 更新日期: 2023-09-27 17:55:29

美好的一天,

我有一个模型类,

如下所示
    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;

此列表显示所有员工及其所有付款。但我需要过滤每个员工 已发布的付款 = 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;

我经常使用实体框架 5

关于它的研究对我不起作用 链接

希望有人能帮助我

提前感谢伙计们

C# linq 查询筛选器子集合

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

(未测试,请修复错误)

从 pyaments 开始,过滤器发布=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();
}