Вопрос

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

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

С указанием where это работает идеально, но мне нужно указать 2 where, которые присутствуют в 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)

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

Есть какие-нибудь идеи?

Спасибо

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

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 запись с идентификатором и полем, в котором столько же тарифов внутри - имеет ли это смысл?

}

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

было бы неплохо иметь возможность использовать метод расширения (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;
    }

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

Спасибо.

Это было полезно?

Решение

Ты делаешь присоединиться к группе здесь, поскольку вы используете 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 }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top