2009-08-20 60 views
2

我想使用动态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 

回答

4

从接受的答案在这里:How do I build up LINQ dynamically

这非常适用于.AsQueryable()类,但.Enumerable()班的话可以使用你用 “为IQueryable的()”

linq using string as where statement http://www.scottgu.com/blogposts/dynquery/step2.png

+0

我认为使用动态LINQ并将where子句构建为字符串的想法具有优点。 – tvanfosson 2009-08-20 13:28:30

+0

您可能想在此发布摘要,所以您的答案是独立的。 – tvanfosson 2009-08-20 13:29:05

0

你可以使用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       
} 
+0

我认为这只适用于原始请求是materializ编辑和你做了与LINQ到对象的加入。我会假设OP会希望在SQL服务器上完成筛选,否则他可以遍历它们并删除他不想要的筛选。 – tvanfosson 2009-08-20 13:26:27

0

下面是用VB中的IQueryable一个简单的例子。

​​

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)  
}