Ajuda com linq juntar
-
22-07-2019 - |
Pergunta
Eu tenho a seguinte expressão em LINQ (sua uma junção) e eu estou selecionando em "J", porque eu preciso para usar J posteriormente (atualmente eu só selecionar J mas uma vez eu tenho esse problema seja solucionado i planeja uso J dentro de outra subconsulta depois)
Mas ele não vai deixar-me fornecer uma onde usando o lado "V" portanto v.IdOFfice é inválido. Eu tentei trocar em torno da junta e que o que acontece eu não posso usar o "GVT" ..
Com especificando o onde ele funciona perfeito, mas eu preciso especificar 2 wheres que estão presentes nas 2 mesas ... daí IdOffice e IdTariff estão em lá próprias tabelas .. eles não são tanto ....
(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)
Provavelmente algo bobo, ele aparece na tabela especificada após a juntar-se eu não sou capaz de usar na onde?
Todas as idéias?
Graças
Este é basicamente o que eu estou tentando alcançar
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
}
basicamente eu acabar com um registro com ID e um campo que tantas tarifas dentro -? Se isso faz sentido
}
Consulta grande trabalho,
que seria bom para ser capaz de usar um método de extensão (c #) assim ... isso é possível para que eu possa tarifa dinamicamente set ... assim, por exemplo i fazer a consulta e eu tenho um método de extensão (que Eu já uso em consultas simples) como assim
public static IQueryable<Models.ItemTariffCol> WithTariffId(this IQueryable<Models.ItemTariffCol> qry, int tariffId)
{
return from t in qry
where t.IdTarifa == tariffId
select t;
}
isso torna muito extensível? Se seu um normal, onde eu posso fazer isso, mas a consulta não está na onde
Obrigado.
Solução
Você está fazendo um grupo juntar-se aqui, desde que você está usando into
. Isso significa que para cada gvt
, você não tem um Item
, mas possivelmente vários (ou nenhum). A lista de todos os itens são armazenados em j
, como um IEnumerable<Item>
. Se você quiser selecionar todas as tarifas para as quais há pelo menos um item com IdOffice == 1
, então você pode fazê-lo como este:
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)
...
Após a edição resposta, parece que você começou a partir da direção errada bem - tanto quanto eu posso ver, você quer uma lista de tarifas para cada item, não a lista de itens para cada tarifa. Para isso, é preciso inverter a sua juntar-se:
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 }
}
Ou você poderia filtrar tarifas direita na junção:
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 }
}