Lambda StartsWith包含null, blank或数据库中的所有值
本文关键字:数据库 包含 StartsWith null blank Lambda | 更新日期: 2023-09-27 18:06:22
我有这个代码片段,它查询一个包含名、中、姓的SQL表。该模型需要名字和姓氏,但中间名是可选的。这是这个代码的问题,我有。无论为中间名输入什么值(空白或存在值),不包含中间名的记录都不会在结果集中返回。搜索John Smith会返回"John M Smith"而不是"John Smith"。我还应该注意到,数据库中的中间名列可以包含空、空或字符串值。这是一个旧的MS SQL数据库,用VB编写了一个糟糕的前端。
代码:var query = (from i in ctx.Individuals
join l in ctx.Licenses on i.IndividualId equals l.IndividualId
where i.FirstName.StartsWith(firstName) && i.LastName.StartsWith(lastName) && i.MiddleName.StartsWith(middleName ?? i.MiddleName)
select new IndividualDTO()
{
IndividualId = i.IndividualId,
FirstName = i.FirstName,
LastName = i.LastName,
MiddleName = i.MiddleName,
LicenseNumber = l.LicenseNumber
}).OrderBy(i => i.FirstName).OrderBy(i => i.LastName).Take(50).ToList();
我们想要匹配以下是否发生MiddleName starts with middleName
或middleName是empty or null
这意味着如果
String.IsNullOrWhitespace(i.MiddleName)
或i.MiddleName.StartsWith(middleName)
.
在
middleName
为空或null的情况下,这将评估&& (true || Doesn't matter)
,这将给我们一个匹配。如果
i.MiddleName
以middleName
开头,那么这将评估&& (false || true)
,这也会给我们一个匹配。
你应该修改
i.MiddleName.StartsWith(middleName ?? i.MiddleName)
(String.IsNullOrWhitespace(i.MiddleName) || i.MiddleName.StartsWith(middleName))
我实际上会重做,只在必要时包含您的条件。这样可以避免使用null或空的中间名。如果搜索字符串可以是空白,则使用string.IsNullOrWhitespace
代替。此外,您还需要在订单中使用ThenBy
来保持您的初始订单。
var query = from i in ctx.Individuals
join l in ctx.Licenses on i.IndividualId equals l.IndividualId
select new IndividualDTO
{
IndividualId = i.IndividualId,
FirstName = i.FirstName,
LastName = i.LastName,
MiddleName = i.MiddleName,
LicenseNumber = l.LicenseNumber
};
if (!string.IsNullOrEmpty(firstName))
{
query = query.Where(i => i.FirstName.StartsWith(firstName));
}
if (!string.IsNullOrEmpty(lastName))
{
query = query.Where(i => i.LastName.StartsWith(lastName));
}
if (!string.IsNullOrEmpty(middleName))
{
query = query.Where(i => i.MiddleName.StartsWith(middleName));
}
var result = query
.OrderBy(i => i.FirstName)
.ThenBy(i => i.LastName)
.Take(50)
.ToList();