C# 具有多种条件和组合的LINQ方法

C# 具有多种条件和组合的LINQ方法,c#,performance,entity-framework,linq,C#,Performance,Entity Framework,Linq,假设我有一个包含1000个条目的细节类列表。如何使用LINQ方法结合FirstCode和SecondCode属性从数据库详细信息表中准确检索匹配数据 public class Detail { public string FirstCode { get; set; } public string SecondCode { get; set; } } 如果我们要检索单个数据,它将如下所示: foreach(var detail in details) { var retriev

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

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级别内进行搜索,因为如果我们有大量数据(例如Details表中的500000多条记录),这并不理想。

您需要以编程方式生成'where'子句。从返回详细信息数据库表中所有行的查询开始

IQueryable<XDetail> queryable = (from d in context.Details select d);
IQueryable queryable=(从上下文中的d开始。详细信息选择d);
…其中XDetail是数据库表的类类型。我假设它与你问题中的细节类不同。现在您需要为查询生成所有子句,这些子句指定我们想要的条目列表

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();
var predicate=PredicateBuilder.False();
foreach(详图d中的详图)
谓词=谓词。或((xd)=>xd.FirstCode==d.FirstCode&&
xd.SecondCode==d.SecondCode));
queryable=queryable.Where(谓词);
var results=queryable.ToList();

您可以看到PredicateBuilder类的代码。请注意,实体框架将生成所需的SQL,但该查询的大小是有限制的。因此,增加1000条条款肯定会使它变得更大。您必须进行试验,但在达到极限之前,可能会限制为100或更少。

您的
Where()
子句将生成正确的SQL语句,该语句将仅从数据库返回相关行。这就是Linq to Entities(它是EntityFramework的一部分)的目的。根据detail.Firstcode和detail.SecondCode将详细信息与详细信息连接起来,并立即检索最终结果为什么要查询数据库中的2000个值?您不能在临时表中插入这些值,然后使用联接选择所需的数据吗?您有两个选项。您可以使用(),这是更多的代码,但如果您对这些值使用索引,则性能会更好,因为这将导致使用索引查找。或者,您可以在查找中连接值(第一个+第二个),并创建一个字符串数组,使用
Contains
并连接数据库表中的值作为Contains调用的输入。这更容易做到,但性能较差,因为它实际上会导致表扫描。试图编写一个包含2000个筛选值的查询是巨大的,这强烈表明这是一个错误。建议的解决方案(Y)不好,你应该询问你想要解决的X问题。超级有用!(也许您还可以将PredicateBuilder添加到答案中)