2009-12-15 54 views
1

我需要複製具有內選擇一個T-SQL語句,使用LINQ:內嵌選擇與LINQ

SELECT *, 
CustomerTypes.Description as CustomerType, 
(Select Min(Distinct DocumentStatistics.StatDateTime) As LastStatCheck 
From DocumentStatistics 
Where DocumentStatistics.CustomerId = Customers.CustomerId) As LastStatCheck 
FROM Customers 
INNER JOIN CustomerTypes ON Customers.CustomerTypeID = CustomerTypes.CustomerTypeID 
ORDER BY CustomerName 

以下是我能來最接近的,但它結束了全退DocumentStatistics,40,000以上。

  Dim docQuery = (From doc In data.DocumentStatistics _ 
         Select doc) 

     Dim query = From customer In data.Customers _ 
        Join docStat In docQuery _ 
        On customer.CustomerID Equals docStat.CustomerID _ 
        Select Customer = customer, LastStatCheck = _ 
         (From doc In docQuery Where customer.CustomerID = doc.CustomerID _ 
         Select doc.StatDateTime).Distinct().Min() 

我錯過了什麼?我如何複製初始SQL語句?

我可以帶VB或C#的例子,我正在使用SQL Server數據庫。

回答

3

您需要使用組加入函數來實現這一點,有點像在C#中的以下內容:

var result = from customer in data.Customers 
      join docStat in data.DocumentStatistics 
        on customer.CustomerID equals docStat.CustomerID into stats 
      where stats.Count() > 0 
      select new 
      { 
       Customer = customer, 
       LastStatCheck = stats.Min(res => res.StatDateTime) 
      }; 

,並在VB.Net

Dim result = From customer In data.Customers _ 
      Group Join docStat In data.DocumentStatistics _ 
        On customer.CustomerID Equals docStat.CustomerID Into stats = Group _ 
      Where stats.Count() > 0 _ 
      Select New With _ 
      { _ 
       .Customer = customer _ 
       .LastStatCheck = stats.Min(Function(res) res.StatDateTime) _ 
      } 
+0

謝謝你的迴應,西蒙。似乎在可查詢名稱「stats」的初始化中存在錯誤。試圖在其他地方實例化它,但我不確定創建它的正確過程。你有關於如何初始化「統計」的建議嗎? – 2009-12-15 16:00:07

+0

嗨,約翰,我錯過了集團加盟結束時的'=集團'。上面應該現在按需要工作... – 2009-12-15 19:58:25

1

約翰,

退房名爲Linqer(我有這個產品沒有關聯)的產品。它需要一個SQL語句並將其轉換爲LINQ。它能夠轉換幾乎所有的查詢。這對我來說非常有用。它也教會了我很多關於LINQ如何工作的知識。

蘭迪

+0

感謝蘭迪的建議,Linqer給了我需要的答案。 – 2009-12-15 16:13:00

1

你真正想要的是組加入。

C#示例:

var query = from c in data.Customers 
      join ds in data.DocumentStatistics 
      on c.CustomerID equals ds.CustomerID into stats 
      select new 
      { 
       Customer = c, 
       LastStatCheck = stats.Min(s => s.StatDateTime) 
      }; 
0

Linqer從我原來的SQL語句中給了我以下結果:

From customer In data.Customers _ 
        Select _ 
        Customer = customer, _ 
        LastStatCheck = (CType((Aggregate lastDateChecked In _ 
        (From docStat In data.DocumentStatistics _ 
        Where docStat.CustomerID = customer.CustomerID _ 
        Select docStat) Into Min(lastDateChecked.StatDateTime)), DateTime?)) 

約Linqer樂於助人的事情是,我可以把在T-SQL語句和運行旁邊的LINQ語句的查詢。

+0

我之前沒有看到過Aggregate關鍵字,所以做了一些搜索,發現這個http://weblogs.asp.net/fbouma/archive/2008/05/21/vb-net -beware-of-the-aggregate-keyword.aspx可能想要小心一點,我已經更新了我的答案,它現在應該做你想做的事情,而不使用Aggregate關鍵字... – 2009-12-15 22:15:47

+0

閱讀本文後,我同意。看來使用Aggregate關鍵字時會有風險,您會引入性能錯誤。雖然這種風險似乎很小,但如果我能夠通過不承擔風險來完成任務,情況會好很多。感謝您的研究。 – 2009-12-16 15:25:05