LINQ包含未从数据库中提取正确的结果

时间:2019-08-27 00:46:19

标签: c# linq .net-core entity-framework-core

我正在尝试使用EF和LINQ从数据库中提取一些记录。
但是,在某些带有某些特定字符串的特定情况下(它们似乎没有什么特别的含义),某些数据库记录将被完全忽略。

我创建了一个新数据库(具有完全相同的架构),并插入了完全相同的记录。使用这个新数据库,我能够使用完全相同的LINQ命令检索记录。 它只是以某些完全随机的方式发生在某些字符串上。

public async Task<List<Customer>> Search(string nameOrTIN)
{
    var wordsInName = nameOrTIN.Split(" ", StringSplitOptions.RemoveEmptyEntries);
    IQueryable<Customer> query = this.context.Customers.AsQueryable();
    foreach (var word in wordsInName)
    {
        query = query.Where(o => o.Name.ToLower().Contains(word.ToLower()) || 
               o.TIN.ToLower().Contains(word.ToLower())).Take(10).OrderBy(p => p.Name);
    }
    return await query.ToListAsync();
}

使用“ John Oliver”作为参数调用Search函数应该返回所有包含字符串“ John”和“ Oliver”的记录,但是即使数据库中存在“ John Oliver”记录也不会返回任何记录

编辑 刚刚发现,如果我寻找“ Oliver John”而不是“ John Oliver”,则会返回所有正确的记录。只是为了增加一点怪异。

编辑 编辑以显示查询的一部分,我在发布我认为没有必要显示的问题时省略了该查询。但是,这实际上是导致我出现问题的原因。 我循环中的.Take(10)是我受苦的罪魁祸首。
感谢Ivan Stoev的评论,我得以弄清它。
不好意思!

2 个答案:

答案 0 :(得分:0)

您无意间更新了Customer对象,并且在两次搜索之间没有正确地将其重置。因此,您从一个已经应用了其他过滤器的可查询对象开始。

尝试将其更改为此:

IQueryable<Customer> query = this.context.Customers.AsQueryable();

答案 1 :(得分:0)

尝试将记录器添加到数据库上下文并将其打印到控制台或日志文件。

当我在数据库上运行类似的查询时,EF使用CHARINDEX,我认为也许CHARINDEX在循环时以某种方式使查询中断。我认为您可以重写此循环/查询,以便更好,更轻松地阅读btw

WHERE ((CHARINDEX(@__ToLower_0, LOWER([o].[Name])) > 0) OR (@__ToLower_0 = N'')) OR ((CHARINDEX(@__ToLower_0, LOWER([o].[TIN])) > 0) OR (@__ToLower_0 = N''))
      ORDER BY [o].[Name]