sélectionnez délégué anonyme avec linq
Je sais qu'il y a une manière de le faire, mais j'ai été frapper ma tête contre un mur en essayant de le comprendre. Cela fonctionne bien:
private GenericRecord CreateGeneric(GenericRecord g, Member m)
{
g.Member = m;
return g;
}
public IList<GenericRecord> ReportFromDatabase(DateTime startDate, DateTime endDate)
{
List<GenericRecord> returnRecords = new List<GenericRecord>();
returnRecords.AddRange(from r in pjRepository.Records
join m in memberRepository.Members on r.SID equals m.MemberId.ToString()
where r.TransactionDate >= startDate && r.TransactionDate <= endDate
select CreateGeneric((GenericRecord)r, m));
return returnRecords;
}
Mais je sais qu'il y a un moyen de le faire sans le CreateGeneric fonction. Comment puis-je sélectionner une fonction de délégué inline?
returnRecords.AddRange(from r in pjRepository.Records
join m in memberRepository.Members on r.SID equals m.MemberId.ToString()
where r.TransactionDate >= startDate && r.TransactionDate <= endDate
select (delegate
{
GenericRecord g = (GenericRecord)r;
g.Member = m;
return g;
}));
Qui me donne cette exception:
The type of the expression in the select clause is incorrect. Type inference failed in the call to 'Select'.
Edit: une Autre tentative a échoué
returnRecords.AddRange((from r in pjRepository.Records
join m in memberRepository.Members on r.SID equals m.MemberId.ToString()
where r.TransactionDate >= startDate && r.TransactionDate <= endDate
select new { r, m }).Select(x =>
{
GenericRecord g = (GenericRecord)x.r;
g.Member = x.m;
return g;
}));
Cela me donne:
Une expression lambda avec une déclaration corps ne peut pas être convertie en une arborescence d'expression.
OriginalL'auteur Nick Spiers | 2011-02-04
Vous devez vous connecter pour publier un commentaire.
Essayer:
La clé différente est que AsEnumerable() fonction. Qui prend un IQueryable et renvoie un IEnumerable, qui, derrière les coulisses, les forces de l'évaluation de l'expression de l'arbre par le fournisseur Linq. Cela empêche le Linq bibliothèque de tenter de convertir la deuxième sélection du lambda à la partie de l'arborescence d'expression (ce qui, dit-il ne peut pas); le second Select au lieu d'effectuer sa transformation sur l'im-mémoire de collection produite par l'évaluation de la IQueryable expression de l'arbre. Puisque vous avez besoin de la requête pour être évaluée avant que l'instruction se termine de toute façon (donc tous les éléments peuvent être ajoutés à returnRecords), il devrait y avoir aucune différence de performances significative.
OriginalL'auteur KeithS
OriginalL'auteur Dr.sai