2012-06-07 2 views
0

Я хочу знать, как сделать выражение Linq, который имеет тот же эффект, как эта 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.

ответ

1

Прежде всего ваш запрос sql. Это эффективно и внутреннее соединение, потому что условие where будет отфильтровывать все строки, где данные от priceforitem равны нулю. Если вы хотите, чтобы преобразовать такой же запрос Linq вы можете сделать это, как от I в db.Items

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, и он даст результат, а также выражение лямбда вашего запроса.

+0

Я просто не уверен с частью 'where t.PriceId == id', будет ли он влиять на результирующие строки, отфильтровывая' t', 'tempvals' пуст. Является ли приоритет оператора 'where' больше, чем второй' from'? Я боюсь, что он будет иметь тот же результат, что и мой первый SQL-запрос с последним 'AND priceforitem.PriceID =? PriceID' заменен на' WHERE priceforitem.PriceID =? PriceID'. – qsoft

+0

'from t in tempvals.DefaultIfEmpty()' используется для внешнего соединения, а 'when' используется для фильтрации результата. –

Смежные вопросы