Seulement sans paramètre constructeurs et les initialiseurs sont pris en charge dans LINQ to entities message
J'ai une méthode qui retourne des données à partir d'un modèle EF.
J'obtiens le message ci-dessus, mais je ne peux pas wotk notre façon de contourner le problème.
public static IEnumerable<FundedCount> GetFundedCount()
{
var today = DateTime.Now;
var daysInMonth = DateTime.DaysInMonth(today.Year, today.Month);
var day1 = DateTime.Now.AddDays(-1);
var day31 = DateTime.Now.AddDays(-31);
using (var uow = new UnitOfWork(ConnectionString.PaydayLenders))
{
var r = new Repository<MatchHistory>(uow.Context);
return r.Find()
.Where(x =>
x.AppliedOn >= day1 && x.AppliedOn <= day31 &&
x.ResultTypeId == (int)MatchResultType.Accepted)
.GroupBy(x => new { x.BuyerId, x.AppliedOn })
.Select(x => new FundedCount(
x.Key.BuyerId,
x.Count() / 30 * daysInMonth))
.ToList();
}
}
FundedCount n'est pas un objectif EF enity, MatchHistory est, ne peut donc pas comprendre pourquoi il se plaint.
Tous les conseils appréciés.
- J'ai remarqué aujourd'hui que l'appel à un
DateTime
constructeur par exemplenew DateTime(2015, 1, 1)
va lancer cette erreur. Cryptique!
Vous devez vous connecter pour publier un commentaire.
La raison, c'est se plaindre, c'est parce qu'il ne sait pas comment traduire votre
Select()
dans une expression SQL. Si vous avez besoin de faire une transformation de données pour un POCO que n'est pas une entité, vous devez d'abord obtenir les données pertinentes à partir de EF et puis le transformer pour le POCO.Dans votre cas, il devrait être aussi simple que d'appeler
ToList()
plus tôt:Être prudent avec cela, cependant, et assurez-vous que vous êtes en limitant la taille de l'ensemble de données retourné par
ToList()
comme beaucoup que possible de sorte que vous n'êtes pas en essayant de charger l'ensemble d'un tableau en mémoire.Message est clair : linq to entities ne prend pas en charge les objets sans sans paramètre ctor.
Donc
Solution1
énumérer avant (ou l'utilisation d'un intermédiaire de type anonyme et de les énumérer sur celui-là)
Solution2
ajouter un sans paramètre ctor à votre FundedCount classe (si c'est possible)
et l'utilisation
C'est de se plaindre car il ne peut pas convertir les références à FundedCount aux instructions SQL.
Tous les fournisseurs LINQ convertir LINQ états et des expressions pour les opérations qui leur cible peut comprendre. LINQ to SQL et LINQ to EF convertir LINQ to SQL, PLINQ convertir les Tâches et les opérations en parallèle, LINQ to Sharepoint va le convertir en CAML etc.
Ce qui se passe si ils ne peuvent pas faire la conversion, dépend du fournisseur. Certains fournisseurs de retour des résultats intermédiaires et de convertir le reste de la requête pour une requête LINQ to Objects. D'autres vont tout simplement échouer avec un message d'erreur.
Échoue avec un message est en fait une meilleure option lorsque vous parlez à une base de données. Sinon, le serveur devrait retourner toutes les colonnes pour le client alors que seulement 1 ou 2 serait réellement nécessaire.
Dans votre cas, vous devez modifier votre sélectionnez pour retourner un type anonyme avec les données que vous voulez, appelez ToList() et ENSUITE créer le FundedCount objets, par exemple:
La première ToList() force la génération de la requête SQL et de l'exécution de la requête qui retourne uniquement les données dont vous avez besoin. Le reste de la requête est en fait Linq to Objects et d'obtenir les données et créer des objets
J'ai eu la même exception dans GroupBy. J'ai trouvé que l'exception "Seulement sans paramètre constructeurs et les initialiseurs sont pris en charge dans LINQ to entities" n'est pas à 100% l'exactitude de la description.
J'ai eu un GroupBy() dans mon "Linq to EntityFramework requête", qui a utilisé une structure Clé dans GroupBy. Qui n'a pas fonctionné. Quand j'ai changé de cette structure de classe normale tout a bien fonctionné.
Exemple de Code