Question

J'ai l'expression suivante dans linq (c'est une jointure) et je sélectionne dans & "; J &"; parce que j'ai besoin d'utiliser J plus tard (actuellement, je ne fais que sélectionner J, mais une fois que j'ai ce problème, je prévois d'utiliser J dans une autre sous-requête après)

Mais cela ne me permettra pas de fournir un emplacement où en utilisant le " V " côté donc v.IdOFfice est invalide. J'ai essayé de permuter les jointures et que ce qui se passe, je ne peux pas utiliser le & "; GVT &"; ..

En spécifiant où cela fonctionne parfaitement, mais je dois spécifier 2 où sont présents dans les 2 tables ... par conséquent, IdOffice et IdTariff sont dans leurs propres tables .. ils ne sont pas les deux ....

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

Probablement quelque chose de stupide, il semble que la table spécifiée après la jointure ne puisse pas être utilisée dans le où?

Des idées?

Merci

C’est essentiellement ce que j’essaie de réaliser

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
      }

En gros, je me retrouve avec 1 enregistrement avec ID et un champ contenant autant de tarifs à l'intérieur - si cela a un sens?

}

La requête fonctionne très bien,

ce serait bien de pouvoir utiliser une méthode d'extension (c #) comme si ... est-ce possible pour que je puisse définir le tarif de manière dynamique ... donc par exemple, je fais la requête et j'ai une méthode d'extension (qui j'utilise déjà sur des requêtes simples) comme si

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

cela le rend très extensible? Si c’est normal où je peux faire cela, mais que la requête n’est pas dans le

Merci.

Était-ce utile?

La solution

Vous faites un groupe rejoindre ici, puisque vous utilisez into. Cela signifie que pour chaque gvt, vous n’avez pas un Item, mais éventuellement plusieurs (ou aucun). La liste de tous les éléments est stockée dans j, sous forme de IEnumerable<Item>. Si vous voulez sélectionner tous les tarifs pour lesquels il y a au moins un article avec IdOffice == 1, vous pouvez le faire comme suit:

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

Après la modification de la réponse, il semble que vous partiez également de la mauvaise direction. Autant que je sache, vous souhaitez une liste des tarifs pour chaque article, et non la liste des articles pour chaque tarif. Pour cela, vous devez inverser votre jointure:

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

Vous pouvez également filtrer les tarifs directement dans la jointure:

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 }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top