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();

Lambda StartsWith包含null, blank或数据库中的所有值

我们想要匹配以下是否发生MiddleName starts with middleName或middleName是empty or null这意味着如果

,我们希望布尔表达式成功

String.IsNullOrWhitespace(i.MiddleName)i.MiddleName.StartsWith(middleName) .

  • middleName为空或null的情况下,这将评估&& (true || Doesn't matter),这将给我们一个匹配。

  • 如果i.MiddleNamemiddleName开头,那么这将评估&& (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();