Помощь с присоединением к linq
-
22-07-2019 - |
Вопрос
У меня есть следующее выражение в 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 }
}