首页 新闻 会员 周边

如何生成Linq查询时的where条件 Expression 语句?

0
悬赏园豆:10 [已关闭问题] 关闭于 2015-02-12 18:09

在用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  这样的形式?

酷小孩的主页 酷小孩 | 菜鸟二级 | 园豆:243
提问于:2015-02-09 21:50
< >
分享
所有回答(2)
0

这个课题叫做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)

 

 

爱编程的大叔 | 园豆:30839 (高人七级) | 2015-02-09 22:04
0

谢谢  爱编程的大叔 的回答,不过不是我想要的实现方式,但还是谢谢了!很钦佩你的编程经验真的很丰富啊!

后来我自己找到解决方法了,测试可行,我简要的列出主要的代码,也希望能帮到遇到同样问题的朋友们:

        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查询扩展 - 乐章 - 博客园 

酷小孩 | 园豆:243 (菜鸟二级) | 2015-02-12 18:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册