2010-09-08 26 views
1

我已經讓自己陷入了一片泡菜!在將LINQ中的條件where子句轉換回SQL時出現問題

我已經做了,沒有工作在我的web應用程序一個時髦的LINQ語句,但現在我想在存儲過程中使用此:

var r = (from p in getautocompleteweightsproducts.tblWeights 
        where p.MemberId == memberid && 
           p.LocationId == locationid 

        select p); 

      if (level != "0") 
       r = r.Where(p => p.MaterialLevel == level); 

      if (column == "UnitUserField1") 
       r = r.Where(p => p.UnitUserField1 == acitem); 

      if (column == "UnitUserField2") 
       r = r.Where(p => p.UnitUserField2 == acitem); 

return r.OrderBy(p => p.LevelNo).ToList(); 

但是,我不能爲我的生活得到有條件的where子句工作!

如果有人能指引我正確的方向,我會非常感激。

親切的問候

回答

1

也許這樣的事?

SELECT * 
FROM dbo.weights 
WHERE member_id = @memberid 
    AND location_id = @locationid 
    AND material_level = CASE WHEN @level = '0' THEN material_level 
           ELSE @level END 
    AND @acitem = CASE @column WHEN 'UnitUserField1' THEN unit_user_field_1 
           WHEN 'UnitUserField2' THEN unit_user_field_2 
           ELSE @acitem END 
ORDER BY level_no 
1

你試過LinqPAD,我敢肯定我最後一次與發揮您可以輸入「LINQ to SQL的」代碼,看看所產生的結果的SQL。否則,請在運行LinqTOSQL的代碼上放置一個SQL跟蹤/分析器,並在跟蹤中查找正在執行的查詢。

0

LukeH的答案會給你正確的行,但是當你嘗試用單個查詢替換查詢生成機器時會丟失一些東西。該查詢的一部分對優化器不透明。

如果您需要原來的查詢as-will-have-been-generated-by-linq,則有兩個選項。

  • 生成每個可能的查詢,並通過IF ELSE控制運行哪一個查詢。
  • 使用動態sql來構造每個查詢(儘管這取代了使用存儲過程的許多好處)。

如果你決定使用動態sql,你應該知道它的curse and blessings

+0

感謝您的建議大衛 - 時間限制召喚,所以我會欺騙和現在使用盧克的答案! – 2010-09-08 10:44:14