2010-03-01 118 views
0

我有以下工作在SQL Query AnalyzerLINQ中的where子句 - C#

select oh.* 
from order_history oh 
join orders o on o.order_id = oh.order_id 
where oh.order_id = 20119 and oh.date_inserted = (
    select max(date_inserted) from order_history where order_id = oh.order_id 
    group by order_id 
) 

我該怎麼辦轉換爲LINQ?從測試代碼,編譯器抱怨:

錯誤操作 '& &' 不能應用於類型 '詮釋' 的操作數和 'System.DateTime的'

我的LINQ代碼:

var query = from ch in cdo.order_histories 
    join c in cdo.orders on ch.order_id equals c.order_id 
    where (ch.order_id.equals(1234)) && 
    (ch.date_inserted == (cdo.order_histories.Max(p => p.date_inserted))) 
    select new OrderData() { }; 

更新:我沒有使用'=='進行比較。其餘

項目是這個從我的SQL查詢:

oh.date_inserted = (
select max(date_inserted) from order_history where order_id = oh.order_id 
group by order_id) 

如何在LINQ做到這一點?

+0

@ltech:嗯,你現在沒有在你的LINQ-to-SQL代碼中顯示你有什麼,所以這有點困難。如果您正在使用LINQ-to-SQL或LINQ-to-Entities,您也​​沒有指定。 – casperOne 2010-03-01 18:46:45

+1

對於初學者來說,在C#'='中用於賦值,'=='用於測試是否相等。 – Greg 2010-03-01 18:49:47

回答

5

order_id字段上過濾時,您看起來像是在某處丟失了等號。你可能有:

oh.order_id = 20119 && ... 

而你應該有:

oh.order_id == 20119 && ... 

注相等運算符與賦值運算符。賦值運算符的結果是分配的值,這就是爲什麼你的錯誤表明你不能比較int和System.DateTime的操作數。

我還假設你在檢查date_inserted的值時也有同樣的問題。

對於問題的第二部分,您已關閉相關子查詢的轉換。

在SQL您有:

oh.date_inserted = (
select max(date_inserted) from order_history where order_id = oh.order_id 
group by order_id) 

而在LINQ到SQL您有

ch.date_inserted == (cdo.order_histories.Max(p => p.date_inserted)) 

你只需要添加的過濾器,其採用封閉的優勢,捕捉了order_historiesorder_idch例如:

ch.date_inserted == (cdo.order_histories. 
    Where(ch2 => ch2.order_id == ch.order_id). 
    Max(p => p.date_inserted)) 
0

同意,在這裏需要一些C#代碼,但是在我頭頂 - 你使用「==」(評估)而不是「=」(賦值),對嗎? C#在這裏區別了SQL沒有的地方。

1

你可以將SQL翻譯成LINQ ...或者你可以寫你想要的LINQ。

var result = cdo.order_histories 
    .Where(oh => oh.order_id == 20119) 
    .OrderByDescending(oh => oh.date_inserted) 
    .Take(1) 
    .Select(oh => new {history = oh, order = oh.order} 
    .Single();