比方说,我有一个包含1000个条目的Detail List类。如何结合使用FirstCode和SecondCode属性的LINQ方法从数据库的Details表中准确检索匹配的数据?
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条记录)。
答案 0 :(得分:1)
您需要以编程方式生成“ 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类here的代码。请注意,实体框架将生成所需的SQL,但是该查询的大小是有限的。因此,添加1000个子句肯定会使它变得更大。您必须进行试验,但在达到极限之前,可能会被限制为100或更少。