首页 新闻 会员 周边

Linq语句 请教

0
悬赏园豆:40 [已解决问题] 解决于 2014-05-04 23:40

Linq 怎么些 in 和 not in 呢
SQL语句:select * fron tablea where type in ('A','B')

Linq:

string name = "type";
string[] customerID_Set =
new string[] { "A","B" };
model = model.Where(n=>customerID_Set.Contains(name));

 

实际执行时, N'@p__linq__0 nvarchar(max) ',@p__linq__0=N'type',

@p__linq__0 IN (N''001'',N''002''),

 

@p__linq__0 ='type',

这样是查询不了的。需要变成 

type IN (N''001'',N''002'')

stevenhzj的主页 stevenhzj | 初学一级 | 园豆:10
提问于:2014-04-30 17:19
< >
分享
最佳答案
0

正确的写法:

From c in model

where customerID_Set.Contains(name)

From c in model

where not customerID_Set.Contains(name)

这样就相当于

Select * from Model where type in ('A','B') 及Not in了。

你写的有点乱,看起来有些费

 

上面的写法是错的。看了你回答1楼的,才知道你是要动态查询。

那就不能用强类型的写法了,必须用到LINQ的动态查询。

大概是写法跟以前拼SQL差不多。

类似这样

Model=model.where(在这儿拼SQL吧)。

收获园豆:10
爱编程的大叔 | 高人七级 |园豆:30839 | 2014-04-30 17:28

是有点乱

关键是 name 是一个字符串变量,转为SQL 就变成  @p__linq__0 IN (N''001'',N''002'')

@p__linq__0 ='type'

stevenhzj | 园豆:10 (初学一级) | 2014-04-30 17:33

@stevenhzj: 

你这个是要用动态查询,不可能使用强类型的写法的。

你可以GOOGLE LINQ DYNAMIC,有个外国的大神有篇文章专门讲这个的,

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx 

使用LINQ的话,动态查询避免不了的话,上面这篇好好看看。

有专门的system.data.linq.dynamic命名空间里面的where扩展来使用拼接的查询条件。

刚刚随便搜索了一下,这篇文章你可以参考,(我没有太仔细看)

http://www.cnblogs.com/whitewolf/archive/2010/08/03/1790954.html

爱编程的大叔 | 园豆:30839 (高人七级) | 2014-04-30 17:37
其他回答(5)
0

model.Where(n=>customerID_Set.Contains(name));

改成model.Where(n=>customerID_Set.Contains(n.type));

收获园豆:10
平常心队长 | 园豆:1113 (小虾三级) | 2014-04-30 17:25

这里是动态的,下一个就不一定是 type了,我是在做检索条件。

支持(0) 反对(0) stevenhzj | 园豆:10 (初学一级) | 2014-04-30 17:28
0

model = model.Where(n=>customerID_Set.Contains(name)); 这一句简直了.

你看不出来这一句的问题?

你的查询需求是什么样的描述一下,上面这个LINQ,我都不只懂啊怎么说

收获园豆:5
吴瑞祥 | 园豆:29449 (高人七级) | 2014-04-30 19:15

看出来了.你是要where动态指定in的列.

你需要表达式树,虽然你看着你在写Lambda,但linq得到是一个Lambda表达式数,是在编译时生成的.

你想实现你的功能要在运行时修改Lambda表达式生成的表达式树,

可以看下where的参数值,用一个变量接收你的Lambda生成的树,

修改后,再传给linq

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-04-30 19:24
0

用表达式树 大概这样子吧

            string name = "type";
            string[] customerID_Set = new string[] { "A","B" };
            
            var param = Expression.Parameter(typeof(实体类), "x");
            var containsExpression = Expression.Call(
                  Expression.Constant(customerID_Set, typeof(string[])),
                                     "Contains", new Type[] {},
                                     Expression.Convert(Expression.Property(param, name), typeof (string)));
            var lambda = Expression.Lambda<Func<T, bool>>(containsExpression, param);
            model = model.Where(lambda);

收获园豆:10
jj91821 | 园豆:461 (菜鸟二级) | 2014-05-01 22:04
0

LINQ不是用来实现复杂的SQL的,复杂的要么用SQL,要么用视图来解决,如果LINQ能实现所有的话EF就不需要再出个脚本语言来实现复杂SQL了

收获园豆:5
56180825 | 园豆:1756 (小虾三级) | 2014-05-02 18:47
0

暂时用 Where("(type==\"001\" || type=\"002\")") 解决了,虽然不是很好。凑合用着了

stevenhzj | 园豆:10 (初学一级) | 2014-05-04 23:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册