iT邦幫忙

0

[LINQ Entity] Join 資料的第一筆如何轉換為LINQ lambda 的語法

想請問以下SQL如何轉換為linq lambda的寫法呢?

SELECT * FROM  [dbo].[test1] AS A
 OUTER APPLY (
    SELECT  TOP 1 *
     FROM  [dbo].[test1]
     WHERE (N'abc' = [company])
     AND A.[Value] = 'TEST' 
     ORDER BY UpdateTime DESC
)  AS B
看更多先前的討論...收起先前的討論...
https://stackoverflow.com/questions/16501002/entity-framework-and-cross-outer-apply 不過這不是Lambda語法就是了。
呃…這少了 TOP 1這個條件,所以也不對
froce iT邦大師 1 級 ‧ 2020-06-29 20:34:23 檢舉
.Take(1)這不是TOP 1嗎?
說錯,應該說少了ORDER BY的條件
fillano iT邦超人 1 級 ‧ 2020-06-30 09:10:38 檢舉
...少了可以自己加阿
https://stackoverflow.com/questions/3014362/c-sharp-outer-apply-in-linq
就是不知道加在哪才需要來問…
@listennn08 join in多個表時,應該如何處理呢?
看起來是要多寫幾個 join
https://stackoverflow.com/questions/5307731/linq-to-sql-multiple-joins-on-multiple-columns-is-this-possible

lambda 寫法
https://stackoverflow.com/questions/9720225/how-to-perform-join-between-multiple-tables-in-linq-lambda
@listennn08 那如果每個join 都需要做order by 和top 1的處理,該如何加上條件?
我上面貼的兩篇文章合起來應該可以解決
或是直接用程式轉
https://stackoverflow.com/questions/8988531/convert-sql-to-linq-query
https://github.com/ganeshkamath89/SQL2LINQConvertor
@listennn08 感謝回覆,但真的不知道怎麼合起來寫?
以下為例,應該怎麼在各自的join 下加上order by 和top 1的處理?
var categorizedProducts = product
.Join(productcategory, p => p.Id, pc => pc.ProdId, (p, pc) => new { p, pc })
.Join(category, ppc => ppc.pc.CatId, c => c.Id, (ppc, c) => new { ppc, c })
.Select(m => new {
ProdId = m.ppc.p.Id, // or m.ppc.pc.ProdId
CatId = m.c.CatId
// other assignments
});
我沒有測試過
從上面兩篇推論出來的程式
var categorizedProducts =
from p in product
join pc in productcategory on p.Id equals pc.ProdId
join c in category on pc.CatId equals c.Id
select new {
p.Id, // or pc.ProdId
c.CatId,
pc.ProdId.OrderByDescending().First(),
c.CatId.OrderByDescending().First()
// other assignments
};
可是寫在select new裡,不就表示要查詢出來? 並沒有要把join in的資料查出來,只是要當作查詢條件而已…
可以用 tempQuery 的方式
https://stackoverflow.com/questions/4014855/linq-join-on-top-1
這樣又有另一個問題,join的table的條件,來自於要查詢的主表上,這樣沒辦法把主表的欄位當join條件
from x1 in e1
join x2 in e2 on k1 equals k2
select v

( e1 ) . Join( e2 , x1 => k1 , x2 => k2 , ( x1 , x2 ) => v)
我剛剛看到 lambda 可以這樣寫
不知道是不是可以變這樣
( e1 ) . Join( e2 , x1 => k1 , x2 => k2 , ( x1 , x2 ) => v .OrderByDescending().First())

也找到這篇 https://stackoverflow.com/questions/492683/how-to-limit-a-linq-left-outer-join-to-one-row 的第二個答案
好,我再試試看,感謝回覆
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友回答

立即登入回答