6

SQLクエリをLINQに変換して、1対1のマッピングで左結合を作成しています。これはメソッド構文である必要があります。私はこれをベールなしで達成しようとして髪を引っ張ってきました。ラムダ構文でそれを行うことができます。以下は、私が実行しようとしているクエリの例です。これらは実際のコードではありません。誰かが私が間違っていることを指摘しますか?

SQL:

SELECT item.*, item_status.*
FROM item
LEFT JOIN item_status 
    ON item.ID = item_status.itemID
    AND item_status.FLAGGED = true
WHERE item.published_date > "2008-06-19"

LINQ:

var linq_query = (
    from selected_item in item
    join selected_item_status in item_status
        on selected_item.ID equals item_status.itemID into joined
    from item_status in joined.DefaultIfEmpty()
    where item_status.FLAGGED = true
    select new {selected_item, selected_item_status}).ToList();
4

1 に答える 1

8

join ... intoaGroupJoinになり、2番目は:fromになります。SelectMany

var linq_query = Item
    .GroupJoin(
        item_status.Where(x => x.selected_item_status.FLAGGED), // EDIT: Where clause moved here.
        selected_item => selected_item.ID,
        selected_item_status => selected_item_status.itemID,
        (selected_item, joined) => new
        {
            selected_item,
            statuses = joined.DefaultWithEmpty(),
        })
    .SelectMany(x => x.statuses.Select(selected_item_status => new
    {
        x.selected_item,
        selected_item_status,
    }))
    // EDIT: Removed where clause.
    .ToList();

Whereとにかくnullステータスが除外されるため、は左側の外部結合を不要にするようです。

編集:いいえ、SQLを確認すると、LINQクエリが少し間違っているように見えます。そのはず:

var linq_query = (
    from selected_item in item
    join selected_item_status
        in (
            from status in item_status
            where status.FLAGGED
            select status)
        on selected_item.ID equals item_status.itemID into joined
    from item_status in joined.DefaultIfEmpty()
    select new {selected_item, selected_item_status}).ToList();
于 2012-10-04T18:40:38.293 に答える