我正在尝试使用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的评论,我得以弄清它。
不好意思!
答案 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]