Expression Lambda Groupe par en C#
J'aimerais groupe de ma requête LINQ par ItemNumber
et de retourner l'ensemble de la table avec le total de Quantity
.
Example:
ItemNumber - ItemName - Quantity
100 Item1 1
150 Item2 2
100 Item1 2
200 Item3 1
150 Item2 2
Should be:
ItemNumber - ItemName - Quantity
100 Item1 3
150 Item2 4
200 Item3 1
C'est la requête que je suis en train de groupe:
public IQueryable<WebsiteOrderStatus> GetOrderStatusByAccountNumberWithoutDeleted
(string accountNumber)
{
return db.WebsiteOrderStatus
.Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1);
}
Et mon meilleur résultat jusqu'à présent(cela ne peut pas compiler tout de même):
public IQueryable<IGrouping<Int32?, WebsiteOrderStatus>> lol(string accountNumber)
{
db.WebsiteOrderStatus
.Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1)
.GroupBy(g => g.ItemNumber)
.Select(g => new
{
g.Key.ItemNumber,
Column1 = (Int32?)g.Sum(p => p.Quantity)
});
}
EDIT:
Merci pour les réponses à tout le monde, je dois faire face. Ces types anonymes sont assez difficile à travailler, à mon avis, j'ai donc trouvé une autre solution.
J'ai fait une autre méthode, qui est la synthèse de la quantité des utilisateurs éléments et les regroupements de la première.
public IQueryable<WebsiteOrderStatus> GetOrderStatusByAccountNumberWithoutDeleted(string accountNumber)
{
return db.WebsiteOrderStatus.Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1).GroupBy(x => x.ItemNumber).Select(grp => grp.First());
}
public int GetQuantityOfUsersItem(string accountNumber, string itemNumber)
{
return db.WebsiteOrderStatus.Where(x => x.ItemNumber == itemNumber && x.AccountNumber == accountNumber).Sum(x => x.Quantity);
}
À la page où j'ai ma gridview j'ai fait:
var query = websiteOrderStatusRep.GetOrderStatusByAccountNumberWithoutDeleted(AppSession.CurrentLoginTicket.AccountNumber).Select(x => new { x.ItemName, x.ItemNumber, x.FormatName, x.Price, x.Status, x.Levering, Quantity = websiteOrderStatusRep.GetQuantityOfUsersItem(x.AccountNumber, x.ItemNumber)});
Pas sûr de ce que les autres ont tort, mais à tout le moins, vous êtes absent un
Quel est le message d'erreur de compilation que vous obtenez?
Probablement qu'il essaie de traiter g.Clé comme un objet, alors que c'est juste de l'int. Si il veut que le nom de l'élément dans le résultat, alors il y aura également de le stocker dans l'objet clé (et de rendre les clés d'un objet qui est comparable) ou lire à partir de la première entrée dans le groupe enumberator, je suppose.
return
dans le deuxième échantillon.Quel est le message d'erreur de compilation que vous obtenez?
Probablement qu'il essaie de traiter g.Clé comme un objet, alors que c'est juste de l'int. Si il veut que le nom de l'élément dans le résultat, alors il y aura également de le stocker dans l'objet clé (et de rendre les clés d'un objet qui est comparable) ou lire à partir de la première entrée dans le groupe enumberator, je suppose.
OriginalL'auteur KLIM8D | 2012-01-24
Vous devez vous connecter pour publier un commentaire.
OriginalL'auteur vc 74
Entities can be created outside of queries and inserted into the data store using a DataContext. You can then retrieve them using queries. However, you can't create entities as part of a query.
Dans ce cas, vous devrez créer une classe personnalisée pour la liaison et de la carte "WebsiteOrderStatus' l'objet de cette classe.OriginalL'auteur Amar Palsapure
Les seuls problèmes que je vois avec votre requête
return
déclaration par les commentaires-
EDIT: Si vous voulez l'obtenir, permet de dire ItemNumber et nom de l'élément , dans l'objet, vous devez également le groupe sur les champs
Voir mise à jour
ok, soo chaque objet que je veux obtenir dans le résultat doit être dans le groupement. En fait, j'ai 5 autres champs dans la table, pourrait-il y avoir une meilleure façon de faire de ce groupe, autres que tous les champs j'ai besoin de figurer dans le groupe?
Non, par définition, chaque champ que vous souhaitez dans la sortie du Groupe, ce qui n'est pas agrégé (c'est à dire, résumé) doit être dans le
GroupBy
. (Mise en garde: Vous pouvez utiliser l'autre suggestion qui consiste à utiliser.First()
mais je ne le recommande pas, vous êtes l'énumération de la liste à chaque fois)OriginalL'auteur Jamiec
Je pense que le
Select
devrait être:Noter le changement dans la première ligne du type anonyme. La clé du groupement est déjà le numéro de l'élément.
OriginalL'auteur Daniel Hilgarth
Vous ne pouvez pas utiliser anonyme de type pour la valeur de retour de type. Vous n'aurez donc jamais de compiler le code.
Également votre expression linq a IQueryable< [anonyme] > type de résultat.
Je crois que vous pouvez faire quelque chose comme ceci:
J'ai fixé ma réponse aussi 🙂
Comment vous le spécifier dans la signature de la méthode?
MSDN: Vous ne pouvez pas déclarer un champ, une propriété, un événement, ou le type de retour d'une méthode comme ayant un type anonyme. De même, vous ne pouvez pas déclarer un paramètre formel d'une méthode, une propriété, un constructeur, ou d'indexation comme ayant un type anonyme. Pour passer d'un type anonyme, ou une collection qui contient les types anonymes, comme argument à une méthode, vous pouvez déclarer le paramètre du type d'objet. Toutefois, cette opération ayant pour but de taper fort. Si vous devez stocker les résultats de la requête ou de les transmettre à l'extérieur de la méthode des limites, pensez à utiliser un ordinaire nommé struct ou class à la place d'un type anonyme.
Merci, je n'ai pas travaillé avec des classes personnalisées avant que. Je vais essayer de donner un coup de feu si je trouve ma solution (modifier le sujet) la lenteur dans la performance et le temps 🙂
OriginalL'auteur Vitali Vishneuski