实体框架Where()被FromSqlRaw(FreeTextTable)忽略

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

这是实体框架 8。我有以下查询:

var fullTextQuery = $"SELECT top {maxRows} * FROM FreeTextTable(Organizations, *, {{0}}, {maxRows}) as t INNER JOIN Organizations u on u.Id = t.[KEY]";

var query = dbContext.Organizations
    .FromSqlRaw(fullTextQuery, queryText);
    .Where(org => org.Name.Contains(itemName))
    .ToListAsync();

这将返回

FreeTextTable()
应返回的对象,但
Where()
子句应排除该对象。
Where()
子句是否被忽略?或者我需要将其逐字添加到
FromRawSql()
中吗?还是别的什么?

entity-framework entity-framework-core entity-framework-8
1个回答
0
投票

它应该可以工作,尽管有一些限制,主要是围绕存储过程。也就是说,除非绝对必要,否则您应该使用

FromSql
而不是
FromSqlRaw

凭直觉,我会考虑稍微重构一下查询:

var fullTextQuery = $"SELECT u.* FROM Organizations u INNER JOIN FreeTextTable(Organizations, *, {{0}}, {maxRows}) as t ON u.Id = t.[KEY]";

var query = await dbContext.Organizations
    .FromSql(fullTextQuery, queryText);
    .Where(org => org.Name.Contains(itemName))
    .ToListAsync();

“TOP(maxRows)”由自由文本搜索的顶部结果的内部联接覆盖。我希望如果 EF 满足查询最初将转到 Organizations 表,这可能足以让它高兴地允许使用 where 子句。

否则,如果查询确实运行但似乎仍然没有考虑

Where
子句,请运行探查器来捕获实际使用的 SQL,这可能会揭示查询解析中剩余的一些有趣之处。

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