0

これらのSQLクエリと同じ効果を持つLinq式の作り方が知りたい

SELECT item.*, priceforitem.*
FROM
  item
  LEFT JOIN priceforitem
    ON priceforitem.ItemID = item.ItemID
    AND priceforitem.PriceID = ?PriceID

メソッドクエリを使用して既に作成していますが、同じ結果が得られるかどうかはわかりません

db.Items
    .GroupJoin(
        db.PriceForItems.Where(pi => pi.PriceID == id),
        i => i.ItemID,
        pi => pi.ItemID,
        (i, pi) => new { Item = b, Prices = pi })
    .SelectMany(
        a => a.Prices.DefaultIfEmpty(),
        (i, pi) => new
        {
            ItemID = i.Item.ItemID,
            Code = i.Item.Code,
            Name = i.Item.Name,
            PriceForItemID = pi.PriceForItemID,
            Price = pi.Price 
        })

そして、しばらく考えた後、このように短くします

db.Items
    .SelectMany(
        i => db.PriceForItems.Where(
            pi => pi.PriceID == id 
                && pi.ItemID = i.ItemID).DefaultIfEmpty(),
        (i, pi) => new 
        {
            ItemID = i.Item.ItemID,
            Code = i.Item.Code,
            Name = i.Item.Name,
            PriceForItemID = pi.PriceForItemID,
            Price = pi.Price 
        })

私はLinqが初めてで、どちらが優れているのか、それをLinqクエリステートメントに変換する方法がわかりません。

4

1 に答える 1

0

まず、SQLクエリ。where条件は、データpriceforitemがnullであるすべての行を除外するため、効果的かつ内部結合です。同じクエリをlinqに変換したい場合は、db.Itemsのiからのように行うことができます。

join p in db.PriceforItems on
i.ItemId equals p.ItemId into tempvals
from t in tempvals.DefaultIfEmpty()
where t.PriceId == id
select new{i.ItemId, ..., t.PriceId, t...., t....}

私は主に、式の代わりにlinqクエリを記述します。それでも式を取得したい場合は、有効なlinqクエリを記述してLinqpadに貼り付けると、クエリの結果とラムダ式が得られます。

于 2012-06-07T11:29:55.700 に答える