我可以将此查询重写为 LINQ 吗?

问题描述 投票:0回答:1

我有这样的疑问

 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 内存数据库?

c# .net entity-framework in-memory-database
1个回答
0
投票

内存数据库不支持原始 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
的好处尚不清楚,我认为它不会带来太大的性能优势。

© www.soinside.com 2019 - 2024. All rights reserved.