c# - 具有多个条件和组合的 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 多条记录)。
解决方案
您需要以编程方式生成“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 或更少。
推荐阅读
- python - 为什么在启动单个工作人员时 sanic 会产生多个线程?
- vba - 寻找更好的方法来设置表单控件的属性
- optimization - 使用 PROC OPTMODEL 创建 SAS 表
- javascript - 打字稿中的联合类型解决不兼容问题
- c++ - C++中的Ciphersaber解密算法
- android - 显示键盘时再次调用 Flutter Bloc Builder
- vhdl - Modelsim 中的尖峰或故障
- python - Python Tkinter - 如何处理未确定时间的用户输入?
- sql - SQL将两个地址列合二为一
- c++ - 如果我不知道变量的类型而必须声明一个变量,我该怎么办?