LINQ to SQL查询中的C#Dynamic WHERE子句
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LINQ to SQL查询中的C#Dynamic WHERE子句相关的知识,希望对你有一定的参考价值。
我想使用动态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 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
答案
从接受的答案:How do I build up LINQ dynamically
这适用于.AsQueryable()类,但是如果使用“as iQueryable()”,则可以使用.Enumerable()类
另一答案
您可以使用JOIN子句:
from pfv in dC.ProductFieldValues
join filter in filterList on (
pfv.ProductTypeFieldID == filter.ProductTypeFieldID
&& pfv.ValueNumber == filter.ValueNumber
)
select new ProductStruct
{
ProductID = pfv.ProductID
}
另一答案
这是一个在VB中使用IQueryable的简单示例。
Private Function GetZeroScoreWhere(ByVal qry As IQueryable(Of ScoreTest), ByVal score As ScoreTest) As IQueryable(Of ScoreTest)
If score.CallType = ScoreTest.CallTypeEnum.XXX Then
Return qry.Where(Function(c) c.AvgScore.Value = 0 Or c.Zero.Trim <> String.Empty)
End If
Return qry.Where(Function(c) c.ValidScore.Value = 0)
End Function
C#中的代码相同:
private IQueryable<ScoreTest> GetZeroScoreWhere(IQueryable<ScoreTest> qry, ScoreTest score)
{
if(score.CallType == ScoreTest.CallTypeEnum.XXX)
{
Return qry.Where(c => c.AvgScore.Value == 0 || c.Zero.Trim != String.Empty)
}
Return qry.Where(c => c.ValidScore.Value == 0)
}
另一答案
我在类似问题中得到的答案对我有用:
How do you add dynamic 'where' clauses to a linq query?
(答案是使用Predicate Builder)
以上是关于LINQ to SQL查询中的C#Dynamic WHERE子句的主要内容,如果未能解决你的问题,请参考以下文章