谁能告诉我为什么这个linq查询不起作用?

时间:2019-08-01 00:19:38

标签: c# entity-framework

很抱歉,如果我缺少真正明显的东西,我已经连续进行了多个小时的编码,而我的大脑却停下来了。我有以下说法:

var hcn = "";
var forename = "";
var surname = "";

foreach (var casenoteResult in casenoteResults)
{
    personResults.AddRange(_ctx.People.Where
        (x => x.PAS_INT_NO == casenoteResult.PAS_INT_NO 
        && x.CSA_NO.Contains(hcn) 
        && x.FORENAMES.ToLower().Contains(forename.ToLower()) 
        && x.SURNAME.ToLower().Contains(surname.ToLower()))
        .ToList());
}

我没有结果。我真正想要的唯一东西是案例注释。但是,如果我注释掉每个'&&',那么我就剩下了:

foreach (var casenoteResult in casenoteResults)
{
    personResults.AddRange(_ctx.People.Where
        (x => x.PAS_INT_NO == casenoteResult.PAS_INT_NO)
        .ToList());
}

我得到1个结果,这是我所期望的。

有人可以帮助我吗?为什么第一个语句不返回此1结果?难道我正在比较空字符串的某些字段为null?找到的一条记录中没有任何空值。我在这里迷路了。请帮助我可怜的受虐大脑!

1 个答案:

答案 0 :(得分:2)

如果我是你,我将像下面这样重写这段代码。分部分地构建可查询的对象以确保您确实了解要实际传递给查询的值是比较安全的。之所以没有得到任何行,可能是因为查询中输入的查询值不是您认为的那样,或者数据库没有将空字符串视为通配符。 (因为基于您发布的内容,所以您正在检查字符串是否包含空字符串,该空字符串在C#中始终为true,但对于您的数据库提供程序而言可能并非如此。)

var queryable = _ctx.People.Where(w => caseNoteResults.Select(s => s.PAS_INT_NO).Contains(w.PAS_INT_NO));

queryable = string.IsNullOrEmpty(hcn) ? queryable : queryable.Where(w => w.CSA_NO.Contains(hcn, StringComparison.InvariantCulture));

queryable = string.IsNullOrEmpty(forename) ? queryable : queryable.Where(w => w.FORENAMES.Contains(forename, StringComparison.InvariantCultureIgnoreCase));

queryable = string.IsNullOrEmpty(surname) ? queryable : queryable.Where(w => w.SURNAME.Contains(surname, StringComparison.InvariantCultureIgnoreCase));

personResults.AddRange(queryable.ToList());

想法是,如果您的hcnforenamesurname为空,则没有必要进行检查。

此外,如果每个字段都可为空,请确保安全处理null。