2017-09-11 2 views
0

Je sais comment construire un arbre d'expression pour interroger Entity Framework, par exemple. "Name" est un champ dans la base de données SQL et il doit être vérifié pour "Methanol". Le Lambda qui est construit à l'intérieur est: {x => (x.Name == "Methanol")}. Maintenant, je veux tester les champs DateTime de la base de données, mais seulement avec la partie Date. Donc mon Lambda seraitComment utiliser DateTime dans les expressions pour LINQ to Entities?

{x => DbFunctions.TruncaateTime (x.EntryDate) == DbFunction.TruncateTime (testDate)}. Cela fonctionne tel quel, mais comment puis-je convertir cela en une expression? Merci, Hucky

Répondre

0
string propertyName = "EntryDate"; 
DateTime testDate = DateTime.Now;    

ParameterExpression parameter = Expression.Parameter(typeof(Chemical), "x"); 
MemberExpression me = Expression.Property(parameter, propertyName); 
var ce = Expression.Convert(me, typeof(DateTime?)); 
MethodCallExpression mc = Expression.Call(null, typeof(DbFunctions).GetMethod("TruncateTime", new Type[] { typeof(DateTime?) }), ce); 
ConstantExpression constant = Expression.Constant(testDate, typeof(DateTime?)); 
BinaryExpression body = Expression.Equal(mc, constant); 
var isEqualExpressionTree = Expression.Lambda<Func<Chemical, bool>>(body, new[] { parameter }); 
Expression<Func<Chemical, bool>> funcExpression = (Expression<Func<Chemical, bool>>)isEqualExpressionTree; 
+0

Salut Akos, merci pour votre réponse. Je reçois une erreur pour Typeof (DbFunctions): Type ou espace de noms "DbFunctions" non trouvé. Je ne peux pas ajouter "using System.Data.Entity" au projet récent, bien que cela soit possible dans d'autres projets dans cette solution. J'essaie de savoir ce qui se passe ici. – Hucky

+0

Avez-vous installé la puce EntityFramework? –

+0

Il est installé, mais j'essaie de l'installer à nouveau. – Hucky