我想使用动态 where 子句执行 LINQ 查询,具体取决于用户为其条件输入了多少个不同的选项。
这可能吗?
我已经在下面发布了我希望它如何工作的代码。
有人有什么建议吗?
附言我尝试使用 .Contains 方法(在 SQL 上生成 WHERE IN,但是参数数量超过 2100 阈值并导致错误“LINQ 传入表格数据流 (TDS) 远程过程调用 (RPC) 协议(protocol)流不正确. 此RPC 请求中提供的参数太多。最大为2100"。
private struct ProductStruct
{
public long ProductID;
}
private struct FilterStruct
{
public long ProductTypeFieldID;
public long ValueNumber;
}
List<FilterStruct> filterList = new List<FilterStruct>();
filterList.Add(new FilterStruct { ProductTypeFieldID = 3, ValueNumber = 195 });
filterList.Add(new FilterStruct { ProductTypeFieldID = 8, ValueNumber = 55 });
List<ProductStruct> productList = new List<ProductStruct>();
productList = (from pfv in dC.ProductFieldValues
where
foreach (FilterStruct filter in filterList)
{
pfv.ProductTypeFieldID == filter.ProductTypeFieldID
&& pfv.ValueNumber == filter.ValueNumber
}
select new ProductStruct
{
ProductID = pfv.ProductID
}).ToList();
编辑
这看起来好像很方便,但不适用于动态位置?
private void Option2()
{
try
{
LinqDataDataContext dataConnection = new LinqDataDataContext(ConnectionString);
List<FilterStruct> filterList = new List<FilterStruct>();
filterList.Add(new FilterStruct { ProductTypeFieldID = 3, ValueNumber = 195 });
filterList.Add(new FilterStruct { ProductTypeFieldID = 8, ValueNumber = 55 });
string whereClause = null;
foreach (FilterStruct filter in filterList)
{
if (whereClause != null)
whereClause += "AND ";
whereClause += string.Format("ProductID IN (SELECT ProductID FROM ProductFieldValue WHERE ProductTypeFieldID = {0} AND ValueNumber = {1})", filter.ProductTypeFieldID, filter.ValueNumber);
}
List<ProductStruct> productList = new List<ProductStruct>();
productList = (from pfv in dataConnection.ProductFieldValues.Where(whereClause)
select new ProductStruct
{
ProductID = pfv.ProductID
}).ToList();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
最佳答案
从此处接受的答案:How do I build up LINQ dynamically
这适用于 .AsQueryable() 类,但如果您使用“as iQueryable()”,则可以使用 .Enumerable() 类
关于.net - LINQ to SQL 查询中的 C# 动态 WHERE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1306129/