繁体   English   中英

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

[英]LINQ method with multiple conditions and combinations

假设我有一个包含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级别中进行搜索,因为如果我们有大量数据,这是不理想的(对于例如详细信息表中的500,000多条记录。

您需要以编程方式生成'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或更低。

暂无
暂无

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

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