我有这样的疑问
SELECT DISTINCT ON (c.""CmsId"") ""CmsId"", c.""Id"", c.""Title""
FROM ""Content"" AS c
LEFT JOIN ""TagsContents"" AS tc ON c.""Id"" = tc.""ContentId""
LEFT JOIN ""Tags"" AS t ON tc.""TagId"" = t.""Id""
WHERE lower(c.""LanguageCode"") = @language AND
(({GetTitleFilters(phraseWords)}) OR ({GetTagFilters(phraseWords)}))
LIMIT @resultsPerPage OFFSET @offsetValue
GetTitleFilters() 和 GetTagFilters() 根据用户输入中的单词以字符串形式返回 where 子句
我像这样执行查询
var results = await _context.Contents
.FromSqlRaw(query, queryParams)
.AsNoTracking()
.ToListAsync(cancellationToken);
所以我的问题是:我正在尝试为此逻辑编写测试。但我收到此错误:
Query root of type 'FromSqlQueryRootExpression' wasn't handled by provider code. This issue happens when using a provider specific method on a different provider where it is not supported.
我使用内存数据库来存储此测试的数据。不确定我这里有什么选择,但是 我的想法是将此查询重写为 LINQ,然后它应该可用于测试(我想在 SQL 端执行查询)。
也许你可以建议我一些东西,也许有一种方法可以执行 FromSqlRaw 内存数据库?
内存数据库不支持原始 SQL 查询,原因很明显:它不是 SQL 提供程序。
您可以像这样编写普通的 LINQ 查询
var results = await _context.Contents
.Where(
(GetTitleFilters(phraseWords) || GetTagFilters(phraseWords))
&& string.Equals(c.LanguageCode, language, StringComparison.OrdinalIgnoreCase))
.Skip(offsetValue)
.Take(resultsPerPage)
.AsNoTracking()
.ToListAsync(cancellationToken);
如果
GetTitleFilters
或 GetTagFilters
正在进行 SQL 注入,那么你可能应该重新考虑它们。在内存数据库上,您需要某种 Expression
生成器。
在内存数据库上使用
await
的好处尚不清楚,我认为它不会带来太大的性能优势。