首页 > 解决方案 > LINQ 可选 where 子句

问题描述

我用过这个例子: Linq with optional WHERE options ...在我的LINQ上制作可选的where子句,但问题是我总是为用户得到空结果。isverified 是一个布尔值,如果主密码正确,则为 true,在这种情况下,我不需要 linq 部分(w.Password == model.Password)

当 isVerified 为真时,我需要我的 linq 看起来像:

var user = _context.Users.SingleOrDefault(w => w.Name == model.Username);

我试过这样的事情:

var user = _context.Users.SingleOrDefault(w => w.Name == model.Username && (!isverified || w.Password == model.Password));

或者

var user = _context.Users.SingleOrDefault(w => w.Name == model.Username && (isverified || w.Password == model.Password));

标签: c#entity-frameworklinq

解决方案


您应该反转isverified条件:

var user = _context.Users.SingleOrDefault(w => w.Name == model.Username && (isverified || w.Password == model.Password));

但它不会在 sql server 中生成最佳查询计划。

因此,首选方式 - 创建动态查询:

var users = _context.Users.Where(w => w.Name == model.Username);

if (!isverified)
{
    users = users.Where(w=>w.Password == model.Password);
}

var user = users.SingleOrDefault();

推荐阅读