使用if if with LINQ Where

时间:2010-09-10 06:47:26

标签: linq asp.net-mvc-2

我想生成动态查询以检查管理where子句的可用参数数量...如果某个参数为null我不想将它包含在where子句中

var test = from p in _db.test
           where if(str1 != null){p.test == str} else i dnt wanna check p.test

我有大约14个where子句的参数

需要帮助, 感谢

5 个答案:

答案 0 :(得分:5)

您可以分步执行:

// set up the "main query"
var test = from p in _db.test select _db.test;
// if str1 is not null, add a where-condition
if(str1 != null)
{
    test = test.Where(p => p.test == str);
}

答案 1 :(得分:1)

除了@Fredrik的回答,你还可以在评估布尔表达式时使用短路规则,如下所示:

var test = from p in _db.test
           where str1 == null || p.test == str1;

修改如果您要测试很多字符串,(str1str2等等),那么您可以使用以下内容,这些内容将被翻译为SQL IN子句:

var strings = new List<string>();
if (str1 != null) strings.Add(str1);
if (str2 != null) strings.Add(str2);
if (str3 != null) strings.Add(str3);
...

var test = from p in _db.test
           where strings.Contains(p.test);

如果你的字符串已经在一个集合中,那就更容易了(如果你有14个,我认为它们会......)

答案 2 :(得分:1)

考虑param1和param2是参数。您的查询应该如下:

string param1 = "Value1";
string param2 = "Value2";

var q = from bal in context.FxBalanceDetails
        where (string.IsNullOrEmpty(param1) || bal.Column1 == param1)
               && (string.IsNullOrEmpty(param2) || bal.Column2 == param2)
        select bal;

这将确保仅在特定参数不为null时才应用where子句。

答案 3 :(得分:0)

您是否根据实体的相同字段检查字符串? 如果是这样,你可以写下这样的东西:

var strings = new[] { "foo", "bar", "ok", "", null };
var query = dataContext.YourTable.AsQueryable();
query = strings.Where(s => !string.IsNullOrEmpty(s))
       .ToList()
       .Aggregate(query, (q, s) => q.Where(e => e.YourField == s));

编辑: 以前的解决方案过于复杂:

var strings = new[] { "foo", "bar", "ok", "", null }.Where(s => !string.IsNullOrEmpty(s))
       .ToList();
var query = dataContext.YourTable.Where(e => strings.Contains(e.YourField));

答案 4 :(得分:0)

var test = 
from p in _db.test
where p.str1 != null ? p.str1 : ""
select p;