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



我正在尝试使用 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">

作为参数的搜索函数应返回包含字符串"John"和"Oliver"的所有记录,但即使数据库中有"John Oliver"记录,也不会返回任何记录。

编辑刚刚发现,如果我查找"奥利弗约翰"而不是"约翰奥利弗",则会返回所有正确的记录。 只是为了增加一点怪异。

编辑已编辑以显示我在发布我认为没有必要显示的问题时省略的部分查询。然而,这就是真正导致我问题的原因。
这。在我的循环中,Take(10)是我痛苦的罪魁祸首。
我能够弄清楚,这要归功于伊万·斯托耶夫的评论。
对不起你们!

您无意中更新了 Customers 对象,并且未在搜索之间正确重置它。因此,您从已应用其他筛选器的可查询对象开始。

尝试将其更改为以下内容:

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

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

当我在我的数据库上运行类似的查询时,EF 使用 CHARINDEX,我认为当您循环时,这个 CHARINDEX 可能会以某种方式抛弃您的查询。我认为您可以重写此循环/查询,使其更好,更容易阅读

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]

最新更新