首页 > 解决方案 > 具有多个条件和组合的 LINQ 方法

问题描述

假设我有一个包含 1000 个条目的详细信息列表类。如何使用结合 FirstCode 和 SecondCode 属性的 LINQ 方法从数据库详细信息表中准确检索匹配数据?

public class Detail
{
  public string FirstCode  { get; set; }
  public string SecondCode { get; set; }
}

如果我们要检索单个数据,它将是这样的:

foreach(var detail in details)
{
    var retrievedData = context.Details
        .Where(x => x.FirstCode == detail.FirstCode && x.SecondCode == detail.SecondCode)
        .FirstOrDefault();

    // Add to some list here
}

但我不想从数据库中获取 1000 次,也不想从 Details 表中获取所有数据,然后在 .NET 级别内进行搜索,因为如果我们有一堆数据(对于例如,详细信息表中有 500,000 多条记录)。

标签: c#performanceentity-frameworklinq

解决方案


您需要以编程方式生成“where”子句。从返回Details数据库表中所有行的查询开始...

IQueryable<XDetail> queryable = (from d in context.Details select d);

...其中 XDetail 是数据库表的类类型。我认为它与您问题中的Detail类不同。现在您需要为查询生成所有子句,以指定我们想要的条目列表...

var predicate = PredicateBuilder.False<XDetail>();
foreach(Detail d in details)
    predicate = predicate.Or((xd) => xd.FirstCode == d.FirstCode && 
                                     xd.SecondCode == d.SecondCode));

queryable = queryable.Where(predicate);
var results = queryable.ToList();

您可以在此处查看 PredicateBuilder 类的代码。请注意,Entity Framework 将生成所需的 SQL,但该查询的大小是有限制的。因此,添加 1000 条子句肯定会变大。您必须进行试验,但在达到限制之前,您可能会被限制在 100 或更少。


推荐阅读