Помогите с linq join - PullRequest
       17

Помогите с linq join

0 голосов
/ 29 октября 2009

У меня есть следующее выражение в linq (это объединение), и я выбираю в "J", потому что мне нужно использовать J позже (в настоящее время я просто выбираю J, но как только я это исправлю, я планирую использовать J в другом подзапросе после)

Но это не позволит мне указать точку, в которой используется сторона "V", поэтому v.IdOFfice недопустим. Я попытался обменяться соединениями, и вот что происходит, я не могу использовать «GVT» ..

С указанием места, где он работает идеально, но мне нужно указать 2 источника, которые присутствуют в 2 таблицах ... следовательно, IdOffice и IdTariff находятся в собственных таблицах ... они не оба ....

(from gvt in Tariffs
join v in Items
on gvt.IdGroupItem equals v.IdGroupItem 
into j
where v.IdOffice == 1 && gvt.IdTariff == 111
select j).Take(50)

Возможно, что-то глупое, кажется, таблица указана после объединения, которое я не могу использовать в где?

Есть идеи?

Спасибо

Это в основном то, чего я пытаюсь достичь

from gvt in Tariffs
  join v in Items
  on gvt.IdGroupItem equals v.IdGroupItem 
  into j
  where v.IdOffice == 1 && gvt.IdTariff == 111
  select new
  {
      id = v.IdItem
      Tariff = from j
      {
    test = j.TariffDesc,
        test1 = j.TariffPrice
      }

В основном я получаю 1 запись с Id и полем, в котором столько же тарифов - если это имеет смысл?

}

Запрос работает отлично,

было бы неплохо иметь возможность использовать метод расширения (c #), например, так ... это возможно, чтобы я мог динамически устанавливать тариф ... так, например, я делаю запрос и у меня есть метод расширения (который я уже использую простые запросы) вот так

    public static IQueryable<Models.ItemTariffCol> WithTariffId(this IQueryable<Models.ItemTariffCol> qry, int tariffId)
    {
        return from t in qry
               where t.IdTarifa == tariffId
               select t;
    }

это делает его очень расширяемым? Если это нормально, где я могу это сделать, но запрос не в где

Спасибо.

1 Ответ

1 голос
/ 29 октября 2009

Вы делаете групповое объединение здесь, так как вы используете into. Это означает, что на каждый gvt у вас есть не один Item, а, возможно, несколько (или ни одного). Список всех элементов хранится в j как IEnumerable<Item>. Если вы хотите выбрать все тарифы, для которых есть хотя бы один пункт с IdOffice == 1, то вы можете сделать это следующим образом:

from gvt in Tariffs
join v in Items
     on gvt.IdGroupItem equals v.IdGroupItem 
     into j
where gvt.IdTariff == 111 && j.Any(v => v.IdOffice == 1)
...

После редактирования ответа кажется, что вы также начали с неправильного направления - насколько я вижу, вам нужен список тарифов для каждого товара, а не список товаров для каждого тарифа. Для этого вам нужно отменить свое присоединение:

from item in Items
join tariff in Tariffs
     on item.IdGroupItem equals tariff.IdGroupItem 
     into tariffs
where item.IdOffice == 1
select new
{
    Id = item.IdItem,
    Tariffs = from tariff in tariffs
              where tariff.IdTariff == 111
              select new { tariff.TariffDesc, tariff.TariffPrice }
}

Или вы можете отфильтровать тарифы прямо в соединении:

from item in Items
join tariff in (from t in Tariffs where t.IdTariff == 111 select t)
     on item.IdGroupItem equals tariff.IdGroupItem 
     into tariffs
where item.IdOffice == 1
select new
{
    Id = item.IdItem,
    Tariffs = from tariff in tariffs
              select new { tariff.TariffDesc, tariff.TariffPrice }
}
...