在用EF查询时,Linq语句:entity = db.DbSet.Where(predicate).FirstOrDefault();
现在我知道实体中的一个属性是 key ,他对应的值是value,因为这里的这个key 是不固定的,动态获取到的,所以不能直接写 Where(o=>o.key==value).FirstOrDefault(),
想问大家我要如何来拼接生成相应的Expression表达式 predicate 呢?就是类似于
方法(string key,string value) 生成 o=>o.key==value 这样的形式?
这个课题叫做Dynamic LINQ,你Google吧.
包括Dynamic where, dynamic order by ....
有一个大神专门有相关的文章介绍。
有一个开源类叫LINQKit里面有一些。还有....总之外事不决找鸽哥。
用法就是类似这样
var query=table.where("KeyField=" & KeyValue)
https://dynamiclinq.codeplex.com/
大神Blog
Dynamic LINQ (Part 1: Using the LINQ Dynamic Query Library)
谢谢 爱编程的大叔 的回答,不过不是我想要的实现方式,但还是谢谢了!很钦佩你的编程经验真的很丰富啊!
后来我自己找到解决方法了,测试可行,我简要的列出主要的代码,也希望能帮到遇到同样问题的朋友们:
Type cType = typeof(T); //Where条件需要一个 Expression<Func<TSource, bool>> predicate // 我想要生成的形式为 o => o.key == key o=> o.A==B // 构建 o=> o.A==B中的 参数o ParameterExpression paramEx = Expression.Parameter(cType, "o"); // 构建 o=> o.A==B中的o.A o.ID Expression equal = Expression.Property(paramEx, cType, onlyKey.Name); //指定o=> o.A==B 中的参数 B Expression right=Expression.Constant(key); //指定o=> o.A==B中的 o.A==B Expression fi = Expression.Equal(equal, right); //获取lambda表达式 o=> o.A==B Expression<Func<T, bool>> lambda = Expression.Lambda<Func<T, bool>>(fi, paramEx); // Expression.Lambda<Func<T,bool>>(Body,参数o) entity = db.BaseDbSet.Where(lambda).FirstOrDefault(); //entity = db.BaseDbSet.Where(o => o.key == key).FirstOrDefault();
具体的可以参考我在园子里找到的这篇文章:简单的Asp.net mvc 里动态生成Linq的Ef查询扩展 - 乐章 - 博客园