2016-09-07 53 views
0

在以下LINQ查詢中,我需要顯示All客戶,包括尚未下訂單但訂單價格超過100美元的客戶。但是我的下面的LINQ Query將返回所有客戶,不管他們的訂單價格。它似乎忽略了我在下面的LINQ查詢中的Where(ord => ord.price > 100)子句。我可能做錯了什麼?LINQ to SQL - Left OUTER加入兩個連接不工作

模式

public class Customer 
{ 
    public int CustomerId { get; set; } 
    public string CustName{ get; set; } 
} 

public class Order 
{ 
    public int OrderId { get; set; } 
    public int CustomerId { get; set; } 
    public float price { get; set; } 
} 

LINQ查詢

var Query1 = from c in Customers 
      join ord in Orders on c.CustomerId equals ord.CustomerId into cord into cord 
      from t in cord.Where(ord => ord.price > 100).DefaultIfEmpty() 
      select new {CustName= c.Name, OrderID = (t == null ? 0 : t.OrderId)}; 

SQL查詢

我想翻譯下面的T-SQL查詢到LINQ查詢:

SELECT c.Name, OrderID 
FROM Customers c 
LEFT OUTER JOIN Orders ord 
    ON c.CustomerID = ord.CustomerID 
    AND ord.Price > 100 
+0

所以你要返回所有客戶的列表,用'OrderId'只與超過100的順序填充?或者您是否想要返回已經下單超過100的客戶名單? –

+0

@WillRay謝謝你的幫助。我在文章中添加了「更新2」部分來回答你的問題。 – nam

回答

0

嗯,我沒有你的數據能夠驗證這一點,但跳到我的一個問題是你沒有指定加入這兩個集合的字段(CustomerId)。

嘗試修改您的查詢是這樣的:(添加on c.CustomerId equals ord.CustomerId

var Query1 = from c in Customers 
      join ord in Orders on c.CustomerId equals ord.CustomerId into cord 
       from t in cord.DefaultIfEmpty() 
      where t.price > 100 
      select new {CustName = c.Name, OrderID = (t == null ? 0 : t.OrderId)}; 
+0

感謝您指出錯字。我已經糾正了這個問題,但是不管他們的訂單價格如何,都向顧客展示。 – nam

+0

@nam有趣的是,我不希望有相同的結果。我對查詢做了一些小改動,把where子句放在自己的行上。仍然是相同的結果? –

+0

@ GrantWinney是的,查詢輸出也讓我很吃驚。 – nam