2009-08-20 241 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)  
}