Pregunta

Tengo la siguiente expresión en linq (es una combinación) y estoy seleccionando en " J " porque necesito usar J más tarde (actualmente solo selecciono J pero una vez que lo solucione, planeo usar J dentro de otra subconsulta después)

Pero no me deja proporcionar un lugar usando " V " lado, por lo tanto, v.IdOFfice no es válido. He intentado intercambiar las uniones y que lo que sucede no puedo usar & Quot; GVT & Quot; ..

Con especificar dónde funciona perfectamente, pero necesito especificar 2 wheres que están presentes en las 2 tablas ... por lo tanto, IdOffice e IdTariff están en sus propias tablas ... no son ambos ...

(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)

Probablemente sea algo tonto, parece la tabla especificada después de la unión que no puedo usar en ¿dónde?

¿Alguna idea?

Gracias

Esto es básicamente lo que estoy tratando de lograr

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
      }

Básicamente termino con 1 registro con Id y un campo con tantas tarifas adentro, ¿si esto tiene sentido?

}

La consulta funciona muy bien,

sería bueno poder usar un método de extensión (c #) así ... es esto posible para poder establecer una tarifa de forma dinámica ... así que, por ejemplo, hago la consulta y tengo un método de extensión (que ya lo uso en consultas simples) así

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

esto lo hace muy extensible? Si es normal donde puedo hacer esto, pero la consulta no está en el lugar

Gracias.

¿Fue útil?

Solución

Estás haciendo una unión de grupo aquí, ya que estás usando into. Esto significa que por cada gvt, no tiene uno Item, sino posiblemente varios (o ninguno). La lista de todos los elementos se almacena en j, como un IEnumerable<Item>. Si desea seleccionar todas las tarifas para las que hay al menos un artículo con IdOffice == 1, puede hacerlo así:

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)
...

Después de editar la respuesta, parece que también has empezado desde la dirección equivocada; hasta donde puedo ver, quieres una lista de tarifas para cada artículo, no la lista de artículos para cada tarifa. Para eso, debes revertir tu unión:

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 }
}

O puede filtrar las tarifas directamente en la unión:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top