【问题标题】:Lambda StartsWith to Include null, blank or all values in databaseLambda StartsWith 在数据库中包含 null、空白或所有值
【发布时间】:2015-08-03 22:04:53
【问题描述】:

我有这段代码 sn-p 查询包含名字、中间名和姓氏的 SQL 表。该模型需要名字和姓氏,但中间名是可选的。这是我遇到的这段代码的问题。无论为中间名输入什么值(空白或存在值),结果集中都不会返回不包含中间名的记录。搜索 John Smith 将返回“John M Smith”,但不会返回“John Smith”。我还应该注意,数据库中的中间名列可以包含 null、空白或字符串值。这是一个旧的 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();

【问题讨论】:

  • 一些数据库将空字符串视为null。但我们可能需要查看生成的查询。

标签: c# lambda


【解决方案1】:

如果发生以下情况,我们希望匹配 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))

【讨论】:

  • 如果您解释一下为什么这可能会解决问题,这可能会有所帮助。
  • 现在包括空白或空值,但如果可选的中间名字段留空,则现在排除具有中间名的字段。想法?
  • @DaveZych:添加了解释。
【解决方案2】:

我实际上会重做此操作,仅在必要时包含您的条件。这样您就可以避免使用 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 2014-09-03
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 2016-12-11
    相关资源
    最近更新 更多