我想使用动态where子句执行LINQ查询,具体取决于用户为其条件输入了多少个不同的选项。C#LINQ to SQL查询中的动态WHERE子句
这可能吗?
我已经发布了如何使用它的代码。
任何人有任何建议吗?
P.S.我试图使用.Contains方法(在SQL上生成WHERE IN,但是参数数量高于2100阈值并导致错误“LINQ传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确。太多的参数在此RPC请求中提供。最大值为2100" 。
private struct ProductStruct
{
public long ProductID;
}
private struct FilterStruct
{
public long ProductTypeFieldID;
public long ValueNumber;
}
List filterList = new List();
filterList.Add(new FilterStruct { ProductTypeFieldID = 3, ValueNumber = 195 });
filterList.Add(new FilterStruct { ProductTypeFieldID = 8, ValueNumber = 55 });
List productList = new List();
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 filterList = new List();
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 productList = new List();
productList = (from pfv in dataConnection.ProductFieldValues.Where(whereClause)
select new ProductStruct
{
ProductID = pfv.ProductID
}).ToList();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
thanks in advance
我认为使用动态LINQ并将where子句构建为字符串的想法具有优点。 – tvanfosson 2009-08-20 13:28:30
您可能想在此发布摘要,所以您的答案是独立的。 – tvanfosson 2009-08-20 13:29:05