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.

Foi útil?

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 }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top