LINQ中的条件谓词?

dev*_*ull 19 c# linq entity-framework

有没有办法将查询ifelse部分结合起来?

public List<MyClass> GetData(Category category, bool flag= true)
{
     IQueryable<MyClass> result;
     if (flag)
     {
        result =  Session.All<MyClass>()
                    .Where(mc => mc.Col.Equals(category.ToString()) && mc.FLAG);
     }
     else
     {
        result = Session.All<MyClass>()
                    .Where(mc => mc.Col.Equals(category.ToString()));
     }

     return result.ToList();
}
Run Code Online (Sandbox Code Playgroud)

Pat*_*man 25

当然.

result =  Session.All<MyClass>()
                 .Where(mc => mc.Col.Equals(category.ToString()) && (!flag || mc.FLAG));
Run Code Online (Sandbox Code Playgroud)

您可以通过创建允许true结果矩阵来确定重写逻辑:

? mc.FLAG   ? flag
            true     false
true        valid    valid
false       invalid  valid
Run Code Online (Sandbox Code Playgroud)

在这里,你看到的情况是有效的,如果flag是假的(两者等同于true)或mc.FLAGtrue.

我还建议先进行标记检查,因为这是性能更好的谓词.如果第一个结果为false,这可能会阻止第二次检查:

result =  Session.All<MyClass>()
                 .Where(mc => (!flag || mc.FLAG) && mc.Col.Equals(category.ToString());
Run Code Online (Sandbox Code Playgroud)

  • 这段代码的意图不如原版.它太紧张了,但你需要一个真值表.OP:不要这样做. (6认同)

小智 21

你可以Where有条件地链.

public List<MyClass> GetData(Category category, bool flag = true)
{
    var result = Session.All<MyClass>()
        .Where(mc => mc.Col.Equals(category.ToString()));

    if (flag) {
        result = result.Where(mc => mc.FLAG);
    }

    return result.ToList();
}
Run Code Online (Sandbox Code Playgroud)