当任何条件不为空时的C#查询

时间:2018-09-14 01:14:24

标签: c# sql linq lambda

我想在任一条件满足时在数据库中查找数据。

粘贴我的代码,以使其更清晰

    [HttpGet]
    [Route("")]
    public IEnumerable<User> GetUsers(string FirstName = null, string LastName = null, int Year = 0, int Month = 0)
    {

        var users = _context.Users.AsQueryable();
        if (FirstName != null || LastName != null || Year != 0 || Month != 0)
        {
            users = _context.Users.Where(u => (u.CreatedAt.Year == Year) && (u.CreatedAt.Month == Month));
        }
        else
        {
            users = _context.Users;
        }

        return users.ToList();

    }

这段代码正在数据库中进行简单的搜索

where year == createdAt.year &&
              month == createdAt.month && 
              LastName == abc && 
              FirstName == abc

但是,如果条件之一为0 / null,则数据库将不返回任何内容,因为不存在month / year == 0或firstname / lastname == null;我想要的是,如果年/月/姓/名是0 /空,那么就忽略它并检查其他条件。

有什么主意吗?

3 个答案:

答案 0 :(得分:1)

// first style
users = _context.Users.Where(u => 
    (Year != 0 ? u.CreatedAt.Year == Year : true) &&
    (Month != 0 ? u.CreatedAt.Month == Month : true) &&
    (FirstName != null ? u.FirstName == FirstName : true) &&
    (LastName != null ? u.LastName == LastName : true));
// second style
users = _context.Users.Where(u => 
    (Year == 0 || u.CreatedAt.Year == Year) &&
    (Month == 0 || u.CreatedAt.Month == Month) &&
    (FirstName == null || u.FirstName == FirstName) &&
    (LastName == null || u.LastName == LastName));

我认为您应该像这样分别检查每个条件。 例如,当Year!= 0且未设置其他所有参数时,原始代码将不返回任何内容。

答案 1 :(得分:0)

您可以将逻辑添加到LINQ查询中以检查条件。

users = _context.Users.Where(x => x.Id !=0 
                               && x.FirstName != null 
                               && x.FirstName != null 
                               && x.Year != 0 
                               && x.Month != 0)
                              .ToList(); 

答案 2 :(得分:0)

尝试一下users = _context.Users.Where(x => && (x.FirstName != null || x.FirstName == FirstName) && (x.Year == 0 || x.Year == Year) && (x.Month == 0 || x.Month == Month) .ToList();