Frage

Ich habe den folgenden Ausdruck in Linq (seine Join) und ich bin die Auswahl in „J“, weil ich J müssen später verwenden (derzeit nur J Auswahl i aber sobald ich dieses Problem behoben haben Plan, den ich auf den Einsatz J innerhalb einer anderen Unterabfrage nach)

Aber es wird mich nicht liefern lassen, wo also mit der „V“ Seite v.IdOFfice ungültig. Ich habe versucht, tauschen um die Verbindungen und das, was passiert, ich nicht die „GVT“ verwenden können ..

die MIt angeben, wo es perfekt funktioniert, aber ich brauche 2 wheres angeben, die ... in den zwei Tabellen vorhanden sind daher IdOffice und IdTariff dort eigene Tabellen sind .. sie sind nicht beide ....

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

Wahrscheinlich etwas albern, erscheint es in der Tabelle nach dem Join angegeben i nicht in der Lage bin in der where zu benutzen?

Irgendwelche Ideen?

Danke

Dies ist im Grunde, was ich zu erreichen bin versucht,

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
      }

basicaly Ende i mit 1 Datensatz mit Id und einem Feld, das so viele Tarife innen - wenn dies sinnvoll ist

?

}

Abfrage Arbeiten groß,

wäre es schön, die Lage sein, eine Erweiterungsmethode (c #) zu verwenden, wie so ... ist dies möglich, so kann ich dynamisch Tarif eingestellt ... so zum Beispiel i die Abfrage zu tun, und ich habe eine Erweiterungsmethode (das ich verwende bereits auf einfache Abfragen) wie so

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

das macht es sehr dehnbar? Wenn es ein normaler, wo ich kann dies tun, aber die Abfrage nicht in der where

Danke.

War es hilfreich?

Lösung

Sie machen eine Gruppe dich hier, da Sie into verwenden. Dies bedeutet, dass für jeden gvt, Sie haben nicht ein Item, aber möglicherweise mehr (oder keine). Die Liste aller Elemente wird in j als IEnumerable<Item> gespeichert. Wenn Sie alle Tarife auswählen möchten, für die es mindestens einen Punkt mit IdOffice == 1, dann können Sie es wie folgt tun:

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

Nach der Antwort bearbeiten, so scheint es, dass Sie so gut aus der falschen Richtung begonnen haben - so weit ich sehen kann, können Sie eine Liste der Tarife für jedes Einzelteil wünschen, nicht die Liste der Elemente für jeden Tarif. Dafür müssen Sie beitreten umkehren:

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

Oder Sie könnten Tarife Filter direkt in der Verknüpfung:

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 }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top