动态生成Linq但在string []为null时抛出异常

时间:2014-03-20 03:35:28

标签: c# linq

 int id = 1;
 string[] employerNos = null;
 var query = from y in mydb.myTable
             where y.ID == id
             && (employerNos == null ? true : employerNos.Contains(y.EmpNo))                             
             select y;
 var result = query.ToList();

字符串数组为null所以我认为该语句应该为true。我不知道它为什么会抛出System.NotSupportedException。

2 个答案:

答案 0 :(得分:2)

因为您的查询不是LINQ to Objects,所以您的LINQ查询提供程序必须将条件语句的两个部分都转换为正确的SQL代码。

不要在查询中包含条件,而是将其取出:

int id = 1;
string[] employerNos = null;

var query = mydb.MyTable.Where(y => y.ID == id)
if(employerNos != null)
    query = query.Where(y => employerNos.Contains(y.EmpNo))

var result = query.ToList();

答案 1 :(得分:1)

它正在尝试将该表达式转换为SQL。我认为问题在于你不能将字符串列表作为参数传递。

所以

var query = from y in mydb.myTable
            where y.ID == id
            && employerNos.Contains(y.EmpNo))                             
            select y;

会转换为类似

的内容
select * from myTable
where ID=@ID
and EmpNo in ('1','3','5') -- employerNos evaluated before translation to sql

但是,如果您使用null检查尝试查询,则会得到类似

的内容
select * from myTable
where ID=@ID
and (@list is null 
    or EmpNo in @list)  -- this bit is not valid SQL

你可以这样做。

var query = 
    from y in mydb.myTable
    where y.ID == id
    select y;

if (employerNos != null) 
    query = query.Where(y => employerNos.Contains(y.EmpNo))