Lambda StartsWith包含数据库

时间:2015-08-03 22:04:54

标签: c# lambda

我有这个代码片段,用于查询包含名字,中间名和姓氏的SQL表。该模型需要名字和姓氏,但中间名称是可选的。以下是我所拥有的此代码的问题。无论为中间名输入什么值(空白或值存在),结果集中都不会返回不包含中间名的记录。寻找约翰史密斯将回归约翰史密斯"但不是约翰史密斯"。我还应该注意,数据库中的中间名列可以包含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();

2 个答案:

答案 0 :(得分:2)

如果发生以下情况,我们希望匹配MiddleName starts with middleName或中间名是empty or null 这意味着我们希望在

时使布尔表达式成功

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

  • 如果middleName为空或为空,则评估&& (true || Doesn't matter)将为我们提供匹配。

  • 如果i.MiddleNamemiddleName开头,则会评估&& (false || true),这也会给我们一个匹配。

您应该更改

i.MiddleName.StartsWith(middleName ?? i.MiddleName)

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

答案 1 :(得分:1)

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