J'ai utilisé Nhibernate avec LINQ un peu maintenant et j'ai quelques problèmes. Dire que j'ai les entités suivantes:NHibernate - LINQ Limitations
public class User
{
public virtual int UserID { get; set; }
public virtual bool IsActive { get; set; }
public virtual bool SomeField { get { return 0; } }
public virtual DateTime DateRegistered { get; set; }
public virtual IList<Membership> Membership { get; set; }
public virtual Membership ValidMembership { get { return Membership.FirstOrDefault(m => m.IsValid); } }
}
public class User2
{
public virtual int UserID { get; set; }
public virtual int MembershipID { get; set; }
}
public class Membership
{
public virtual int MembershipID { get; set; }
public virtual bool IsValid { get; set; }
}
Maintenant, si je lance la requête suivante:
var users = service.Linq<User>()
.Where(u => u.IsActive) // This would work
.Where(u => u.SomeField > 0) // This would fail (i know i can map these using formulas but this is here to illustrate)
.Where(u => u.Membership.Any(m => m.IsValid)) // This would work
.Where(u => u.ValidMembership != null) // This would fail
.Where(u => u.DateRegistered > DateTime.UtcNow.AddDays(-1)) // This would work
.Where(u => u.DateRegistered.AddDays(1) > DateTime.UtcNow) // This would fail
.Select(u => new User2 { UserID = u.UserID }) // This would work
.Select(u => u.UserID) // This would work
.Select(u => new { UserID = u.UserID }) // This would fail
.Select(u => new User2 { UserID = u.UserID, MembershipID = u.Membership.Any(m => m.IsValid) ? u.Membership.Any(m => m.IsValid).First().MembershipID : 0 }); // This would fail
J'ai ajouté un commentaire à côté de chacun à indiqué qu'ils travailleraient ou échouer. Ce sont les scénarios auxquels je peux penser en ce moment. J'ai réussi à surmonter ces problèmes en convertissant les données en liste avant de devoir faire quelque chose de trop sophistiqué. Cela a évidemment un impact sur les performances. Je me demandais si les futures versions du fournisseur LINQ pour NHibernate les supporteraient? Aussi, quelqu'un sait-il comment le cadre d'entité pourrait gérer ces scénarios. J'imagine que le cadre de l'entité serait une amélioration, mais je ne veux pas sauter en bateau si les mêmes problèmes existent.
Appréciez vos commentaires. Merci
Pourriez-vous fournir un échantillon de vous convertir les données en une liste avant de faire les choses de fantaisie? Pour le moment, je ne suis pas vraiment sûr de votre question. – Gage
Salut, fondamentalement, je filtrais les données autant que possible, puis en ajoutant .ToList() avant d'enchaîner plus loin les clauses/select. Cela signifie que moins de travail est fait en mémoire. – nfplee