J'écris une classe, elle a des requêtes. attention, la whereitem est une petite classe, ses membres du corps comprennent une expression Expression<Fun<T,bool>>
lambda est utilisé pour filtrer la requêteProblèmes avec les requêtes Entity Framework
public override List<T> Find<T>(int start, int len = 10, IWhereItem<T> whereitem = null, IOrderItem<T> orders = null, bool isDetach = true)
{
var context = getInstence();
var edminfo = EdmMgr[typeof (T)];//EdmMgr Include some dataservice infomation
ObjectQuery<T> query = context.CreateQuery<T>("[" + edminfo.TableName + "]");
if (whereitem != null && whereitem.Body != null)
query = query.Where(whereitem.Body).AsObjectQuery();
string orderString = orders == null ? "it." + edminfo.KeyName + " asc" : orders.OrderString;
List<T> result = start == -1
? query.OrderBy(orderString).ToList()
: query.OrderBy(orderString).Skip(start).Take(len).ToList();
//......and else
return result;
}
puis, quand je le lance, je reçois une erreur, il a dit « requête LINQ to Entities ne prend pas en charge la méthode de création de requête.Pour plus d'informations, reportez-vous à la documentation Entity Framework. "
alors je change mon code.
public override List<T> Find<T>(int start, int len = 10, IWhereItem<T> whereitem = null, IOrderItem<T> orders = null, bool isDetach = true)
{
var context = getInstence();
var edminfo = EdmMgr[typeof (T)];
ObjectQuery<T> query = context.CreateQuery<T>("[" + edminfo.TableName + "]");
query = MemerVisitor.IncludeMembers.Aggregate(query, (current, str) => current.Include(str));
string orderString = orders == null ? "it." + edminfo.KeyName + " asc" : orders.OrderString;
List<T> result = query.OrderBy(orderString).Skip(start).Where(whereitem.Body).Take(len).ToList();
return result;
}
ainsi. c'est bon, mais c'est moche, non? le WHERE est après ORDERBY. quand je change leur emplacement, j'obtiens une erreur. Le type ne correspond pas. Quel autre bon moyen?
================== supplémentaires =========================== Afin de faciliter la réception appel cette méthode en passant une chaîne (par exemple "it.UserId desc") sur l'ordre de tri OrderItem, en fait WhereItem est Expression> le paquet, ma question n'est pas de savoir si implémenter le filtre est l'instruction entityframework, mais peut diviser l'opération de chaîne, parce que si la première implémentation de la Où dans la requête après il converti en IQueryObject pas ObjectQuery type, donc une fois cast, après l'implémentation de Orderby une erreur. Tels que:
using (DataService<User> db = new DataService<User>())
{
user = db.Find(x => x.Moreinfo.CopSchool.CopSchoolId == 13&& x.Role.Title.Equals("xxxx")).FirstOrDefault();
}
DataService que j'enveloppé la classe. L'équivalent d'un DAO. Mais est réalisé EF. Certaines requêtes peuvent être transmises, mais d'autres ne le sont pas. Les raisons ne sont pas claires. Mais certainement à cause de la conversion de type causée. J'utilise. Net 3.5sp1 vs2010 modèle de données d'entité par défaut (.Edmx)
Si je dirige l'implémentation de query.OrderBy (xxx). Ignorer (xx). Où (xxx). Prenez (xx). ToList() pour retourner les résultats, mais il y a quelques problèmes, il est le filtre de premier ordre obtenu dans le saut de xx derniers mois.
Je voudrais demander. Où (XX). OrderBy (xxx). Ignorer (xx). Prenez (xx). ToList() ... mais ne peut pas être effectué parce que le Where (Expression) à renvoyer mais pas ObjecteQuery IEnumerable (type de paramètre Expression de l'heure) ou IQueryable (paramètre de type Func time). Où ne peut être placé sur le dos, tout en saut appeler après avoir OrderBy, où si maladroit au milieu de ...
@user: s'il vous plaît fournir un peu de détails sur ce problème se produit en réalité. Y a-t-il une exception? Alors s'il vous plaît le poster. Nous ne pouvons pas tous lire dans les pensées. –