2009-08-25 82 views
2

你好,你怎麼做linq連接到sql?如何在linq連接sql?

我看到他們有關鍵詞連接和組連接,但他們是什麼樣的連接?

Left,Right,Cross,Inner?

另外如何在完成後選擇某些列?

喜歡

選擇列1,列2
從表A;

查詢或方法語法都可以。我仍然無法決定我更喜歡哪一種,似乎都有他們的優勢。

回答

4

作爲第一步,我肯定會推薦閱讀Scott Guthrie出色的Using Linq-to-SQL多部分教程。它涵蓋了很多Linq-to-SQL基礎知識。

還檢查出Hooked on LINQ 5 minute overview - 正如它在那裏提到的那樣,通常在Linq-to-SQL中,你甚至不需要自己表達JOIN - LINQ-to-SQL直接通過暴露來處理大量這些內容實體引用和實體集引用。

如果你後來得出結論,你確實必須使用明確的JOIN,Bilal Haidar很好地展示瞭如何在他的博客文章中做explicit LEFT OUTER JOIN

的INNER JOIN相對簡單的「正常」的情況下 - 你只需添加一個

from c in customers 
    join o in orders on o.customerid equals c.customerid 

到您的查詢。

至於選擇個別領域 - 見斯科特格思裏的介紹文章系列 - 他詳細解釋它!

基本上,你可以做的三兩件事之一:

  • 選擇整個實體(如客戶),並取回所有的信息,它
  • 選擇一些領域進入一個新的現有類型(例如,「CustomerOrder」型)
  • 選擇一些領域進入一個新的匿名類型

這將選擇誰有一個訂單的所有客戶:

from c in customers 
     join o in orders on o.customerid equals c.customerid 
     select c; 

這將選擇所有的客戶和訂單到已經存在於項目中的某處一個新的「CustomerOrder」類型:

from c in customers 
     join o in orders on o.customerid equals c.customerid 
     select new CustomerOrder { CustomerName = c.Name, 
           CustomerID = c.CustomerId, 
           OrderDate = o.OrderDate, ...... } ; 

這將選擇客戶ID和訂單日期到一個新的,匿名類型供您使用:

from c in customers 
     join o in orders on o.customerid equals c.customerid 
     select new { CustomerID = c.CustomerId, OrderDate = o.OrderDate } ; 

這是一個強類型的 - 而且有這背後一個完整的.NET CLR類型 - 你只是不知道它的名字:-)但你可以在代碼中使用這些內容,你會得到Intellisense和所有優秀的一個快速暫時處理一些數據。

馬克

+0

在你的代碼示例中,你需要使用「equals」關鍵字而不是「=」 (賦值運算符)甚至是「==」(相等運算符)。 – 2009-08-25 05:16:03

+0

糟糕 - 謝謝,蘭斯!!我只是不習慣那種,不知何故..... – 2009-08-25 05:16:43

+0

感謝您的例子。加入應該少一點,但我是在這種情況下,也許你可以做到這一點,但我不知道怎麼做,發生了什麼事,我有一個PK和FK的關係。我想先根據where子句過濾掉PK表。根據我從PK表中得到的過濾結果,我想從FK表中獲得一對字段。但我不確定如何合併數據庫並將其返回。 – chobo2 2009-08-25 18:01:34

0

LINQ中的join關鍵字會給你一個內連接。您可以通過在select子句中創建一個新對象來「投影」結果。該對象可以是鍵入的或匿名的。下面是一個示例:

var ordersAndProducts = from o in orders 
    join p in products on o.ProductId equals p.ProductId 
    select new { OrderDate = o.OrderDate, ProductName = p.Name }; 

此查詢對ProductId屬性上的訂單和產品集合執行內部聯接。結果集合中的每個項目都被投影到一個匿名對象中(新的{..屬性/值...列表}}創建一個即時對象

如果您使用的是LINQ to SQL(它看起來像您你可以通過調試你的應用程序或者在你的數據庫上運行profiler來看到發送到數據庫的SELECT語句。