我有这个代码片段,用于查询包含名字,中间名和姓氏的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();
答案 0 :(得分:2)
如果发生以下情况,我们希望匹配MiddleName starts with middleName
或中间名是empty or null
这意味着我们希望在
String.IsNullOrWhitespace(i.MiddleName)
或强>
i.MiddleName.StartsWith(middleName)
。
如果middleName
为空或为空,则评估&& (true || Doesn't matter)
将为我们提供匹配。
如果i.MiddleName
以middleName
开头,则会评估&& (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();