2012-11-26 84 views
0

我必須在C#中使用LINQ進行一些查詢。我用SQL請求嘗試了我的邏輯。它看起來像這樣:將內部連接的SQL語句轉換爲LINQ

SELECT DISTINCT test_laktationen.lom, test_laktationen.laktanfang, test_laktationen.laktende, b_milch_hms_diagnose.diagnose 
FROM   test_laktationen INNER JOIN 
         b_milch_hms_diagnose ON test_laktationen.lom = b_milch_hms_diagnose.lom AND b_milch_hms_diagnose.behanddatum BETWEEN 
         test_laktationen.laktanfang AND test_laktationen.laktende INNER JOIN 
         b_milch_hms_kalbung ON test_laktationen.lom = b_milch_hms_kalbung.lom AND test_laktationen.laktanfang = b_milch_hms_kalbung.kalbedatum 
WHERE  (b_milch_hms_diagnose.diagnose LIKE '6.01.01.%' OR 
         b_milch_hms_diagnose.diagnose LIKE '6.01.02.%' OR 
         b_milch_hms_diagnose.diagnose LIKE '6.01.03.%' OR 
         b_milch_hms_diagnose.diagnose LIKE '6.01.04.%') AND (b_milch_hms_kalbung.gebverlauf = 3 OR 
         b_milch_hms_kalbung.gebverlauf = 4) 

這工作就像它應該,但現在我必須從數據表中提出這個請求。這可能與LINQ?解決這個問題有什麼好的做法?

+0

我們是否會假設您使用的實體框架? – LukeHennerley

+0

還沒有。我目前在我的應用程序中使用了一些SQLCommands和一些LINQ語句,我現在可能會保持這種方式... – Bautzi89

回答

1

您需要一個數據上下文才能執行直接訪問。我會推薦Linq2Sql類文件(* .dbml)來啓動它。一旦你在服務器資源管理器的LINQ2SQL類來創建你的數據結構,你的LINQ聲明看起來是這樣的:

var context = new MyLinq2SqlContext(); 

var results = (from lak in context.test_laktationen 
    join milch in context.b_milch_hms_diagnose 
     on lak.lom equals milch.lom 
    join kalbung in context.b_milch_hms_kalbung 
     on lak.lom equals kalbung.lom and lak.laktanfang equals kalbung.kalbedatum 
    where 
     (milch.diagnose.StartsWith("6.01.01") || 
     milch.diagnose.StartsWith("6.01.02") || 
     milch.diagnose.StartsWith("6.01.03") || 
     milch.diagnose.StartsWith("6.01.04")) && 
     (kalbung.gebverlaug == 3 || kalbung.geberlauf == 4) && 
     ((milch.behanddatum > lak.laktanfang && milch.behanddatum < lak.laktende) ||  (milch.behanddatum < lak.laktanfang && milch.behanddatum > lak.laktende)) 
    select new { 
      lak.lom, 
      lak.laktanfang, 
      lak.laktende, 
      milch.diagnose 
    }).Distinct(); 

這可能需要調整在最後「其中」條款,以確保您得到「之間「部分正確。 BETWEEN不會從Linq本地轉換,但只要您可以預測哪個值可能會更大,就可以對其進行編碼。

+0

感謝您的快速回答。這似乎很有用,但我仍然有一些問題。我不想在我的函數中使用上下文,因爲有些表並不存在於數據庫中。 'test_laktationen'例如是在運行時創建的數據表。我還希望在其他表中加載所需的值。然後我想通過鏈接將此查詢複製到生成的數據表中。這可能嗎? – Bautzi89

+0

如果您不想使用上下文,那麼您必須將數據放入「IEnumerable」對象中。然後你的上下文將成爲對象本身。 –

+0

是的,你是對的。我現在想出瞭如何去做。非常感謝! – Bautzi89