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'')
正确的写法:
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吧)。
是有点乱
关键是 name 是一个字符串变量,转为SQL 就变成 @p__linq__0 IN (N''001'',N''002'')
@p__linq__0 ='type'
@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
model.Where(n=>customerID_Set.Contains(name));
改成model.Where(n=>customerID_Set.Contains(n.type));
这里是动态的,下一个就不一定是 type了,我是在做检索条件。
model = model.Where(n=>customerID_Set.Contains(name)); 这一句简直了.
你看不出来这一句的问题?
你的查询需求是什么样的描述一下,上面这个LINQ,我都不只懂啊怎么说
看出来了.你是要where动态指定in的列.
你需要表达式树,虽然你看着你在写Lambda,但linq得到是一个Lambda表达式数,是在编译时生成的.
你想实现你的功能要在运行时修改Lambda表达式生成的表达式树,
可以看下where的参数值,用一个变量接收你的Lambda生成的树,
修改后,再传给linq
用表达式树 大概这样子吧
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);
LINQ不是用来实现复杂的SQL的,复杂的要么用SQL,要么用视图来解决,如果LINQ能实现所有的话EF就不需要再出个脚本语言来实现复杂SQL了
暂时用 Where("(type==\"001\" || type=\"002\")") 解决了,虽然不是很好。凑合用着了