我想在任一条件满足时在数据库中查找数据。
粘贴我的代码,以使其更清晰
[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 /空,那么就忽略它并检查其他条件。
有什么主意吗?
答案 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();