【发布时间】:2009-08-20 13:18:07
【问题描述】:
我想执行一个带有动态 where 子句的 LINQ 查询,具体取决于用户为其条件输入了多少不同的选项。
这可能吗?
我在下面发布了我希望它如何工作的代码。
有人有什么建议吗?
附:我尝试使用 .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<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();
编辑
这看起来好像很方便,但不适用于动态 where in?
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());
}
}
【问题讨论】:
标签: .net sql-server-2005 linq-to-sql c#-3.0