J'ai le code suivant:
entity.Property(e => e.Payee).HasColumnType("varchar(255)");
Je ne comprends pas complètement ce qu'il fait en plus de me renvoyer une liste de CheckNumber et Amount. La table CheckRegister contient la colonne Payee, de même que le modelBuilder correspondant de l'EF:
var checkRegisters = await Database.Client.Context.CheckRegister
.Where(cr => cr.CheckingAccount == account
&& cr.CheckDate >= fromDate
&& cr.CheckDate <= toDate
&& cr.Void == "N" )
.GroupBy(cr => cr.CheckNumber,
cr => cr.Amount, (key, g) =>
new {
CheckNumber = key,
Amount = g.Sum()
})
.OrderBy(c => c.CheckNumber)
.ToListAsync();
Comment puis-je ajouter le bénéficiaire à la liste qui me retourne?
3 Réponses :
Je l'ajouterais à l'objet que vous créez dans GroupBy. Donc, changez la ligne 3 comme ci-dessous
.GroupBy(cr => cr.CheckNumber, cr => cr.Amount, cr => cr.Payee, (key, g) =>
new { CheckNumber = key, Amount = g.Sum(), Payee = g.Payee})
Notez que grouper par ne séparait que par nombre et montant, donc si vous groupez également par bénéficiaire, vous devriez vous attendre à ce que la liste résultante soit plus longue. Cela suppose également que Bénéficiaire est le nom de la colonne de votre table.
Cette solution et celle de @Oscar M donnent la même erreur: les arguments de type pour la méthode 'Queryable.GroupBy ..... ne peuvent pas être déduits de l'utilisation. Essayez de spécifier les arguments de type explicitement.
Est-ce que cr est un objet, éventuellement de type CheckRegister? Pouvez-vous ajouter le bénéficiaire aux champs de cet objet sous forme de chaîne, puis réessayer le code?
Je pensais que j'avais déjà cela dans le dernier bit de code de mon message d'origine avec: entity.Property (e => e.Payee) .HasColumnType ("varchar (255)"); c'est quoi Entity Framework s'est construit à partir de mes tables de base de données ... du moins, c'est ainsi que je comprends que cela fonctionne
Je dois ajouter que c'est Entity Framework Core. Ne fonctionne toujours pas après avoir essayé de nombreuses variantes du Group By
Ajoutez la nouvelle colonne au groupe par:
var checkRegisters = await Database.Client.Context.CheckRegister
.Where(cr => cr.CheckingAccount == account && cr.CheckDate >= fromDate && cr.CheckDate <= toDate && cr.Void == "N" )
.GroupBy(cr => cr.CheckNumber, cr => cr.Amount, e => e.Payee , (key, g, p) => new { CheckNumber = key, Amount = g.Sum(), Payee = p})
.OrderBy(c => c.CheckNumber).ToListAsync();
Cette solution et celle de @ cyclopeanCity donnent la même erreur: les arguments de type pour la méthode 'Queryable.GroupBy ..... ne peuvent pas être déduits de l'utilisation. Essayez de spécifier les arguments de type explicitement.
Ce que fait le code:
Votre base de données a une table qui contient CheckRegisters . Chaque CheckRegister possède au moins les propriétés CheckingAccount , CheckDate , Void , CheckNumber et Montant , et selon vous il a aussi une propriété Payee:
Donc votre code décrit pas à pas.
var result = Database.Client.Context.CheckRegister
.Where(...)
.GroupBy(cr => cr.CheckNumber,
// ResultSelector: take every key (which we call checkNumber)
// and all CheckRegisters with this CheckNumber
// to make one new object:
(checkNumber, checkRegistersWithThisCheckNumber) => new
{
CheckNumber = checkNumber,
// for Employees: Select property Employee, and convert them to a List
Employees = checkRegistersWithThisCheckNumber
.Select(checkRegister => checkRegister.Employee)
.ToList(),
// Amounts: select the Amounts and Sum
Amount = checkRegistersWithThisCheckNumber
.Select(checkRegister => checkRegister.Amount)
.Sum(),
});
Beaucoup plus près et je pense que je commence à voir la lumière. La seule erreur est "clé" après CheckNumber = key La clé de nom n'existe pas dans le contexte actuel. Merci pour l'exemple bien commenté. Une idée de l'erreur clé?
oups, tapez après avoir changé les identifiants pour des noms plus descriptifs. Corrigé