簡體   English   中英

將帶有子選擇的聯接的SQL查詢轉換為linq語句

[英]Convert sql query with a join on a subselect to a linq statement

我正在嘗試將以下SQL查詢轉換為LINQ語句

SELECT t.*
FROM    (
        SELECT Unique_Id, MAX(Version) mversion
        FROM    test
        GROUP BY Unique_Id
    ) m INNER JOIN
    test t  ON m.Unique_Id = t.Unique_Id AND m.mversion = t.Version

LINQ聲明

var testalt = (from altt in CS.test
group altt by altt.Unique_Id into g
join bp in CS.alerts on g.FirstOrDefault().Unique_Id equals bp.Unique_Id
select new ABCBE
{
ABCName= bp.Name,
number = bp.Number,
Unique_Id =  g.Key,
Version = g.Max(x=>x.Version)
});

我收到where子句的錯誤。 請幫忙

SQL字段

這不是一個簡單的直接轉換,但是您可以使用linq方法語法完成同樣的事情。 對查詢表達式樹執行第一個查詢,然后將您根據CS.alerts分組從該表達式樹中加入。 這會將CS.test查詢中的表達式樹合並到CS.alerts的表達式樹中,以將兩個表達式樹結合在一起。

評估表達式樹以構建查詢並在枚舉時執行所述查詢。 在這種情況下,枚舉是ToList()調用,但是從枚舉中獲取結果的任何內容都將執行查詢。

var query1 = CS.test.GroupBy(x => x.Unique_Id);
var joinResult = CS.alerts.Join(query1, 
   alert => new { ID = alert.Unique_Id, Version = alert.Version },
   test => new { ID = test.Key, Version = test.Max(y => y.Version }, 
   (alert, test) => new ABCBE { 
      ABCName = alert.Name, 
      number = alert.Number, 
      Unique_Id = test.Key, 
      Version = test.Max(y => y.Version)
    }).ToList();

因為query1仍然是一個IQueryable,並且您正在使用CS.alerts(我猜CS是您的數據上下文),所以它應該加入並構建查詢以在ToList()枚舉上執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM