大佬教程收集整理的这篇文章主要介绍了无法翻译 EF 核心查询,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试开发一些需要运行以下复杂查询的动态类型的代码。
tag_user
实际上我想找到包含其中一个 searchKeys 的行。例如,如果我有这样的搜索键:
public function up()
{
Schema::create('Tags',function (Blueprint $table) {
$table->ID();
$table->string('name');
$table->string('label');
$table->timestamps();
});
Schema::create('tag_user',function (Blueprint $table) {
$table->unsignedBigInteger('tag_ID');
$table->foreign('tag_ID')->references('ID')->on('Tags')->onDelete('cascade');
$table->unsignedBigInteger('user_ID');
$table->foreign('user_ID')->references('ID')->on('users')->onDelete('cascade');
$table->primary(['tag_ID','user_ID']);
});
}
然后我想找到例如名称为 IEnumerable<string> searchKeys = search.KeySearch.Split(',').Select(key => key.Trim());
var searchedIDs = _dbContext.Keys
.Where(key => searchKeys.Any(searchKey => EF.Functions.like(key.name,searchKey)))
或名称为 var searchKeys = ["name_%","last_x%];
的行。
但是 ef cores 说它无法翻译,并建议要么编写可翻译的查询,要么在客户端执行查询(这在我的问题中不合适)。
system.invalIDOperationException: liNQ 表达式 'DbSet() .Where(k => __searchKeys_0 .Any(searchKey => __Functions_1 。像( 匹配表达式:k.name, 模式:searchKey)))' 无法翻译。要么以可翻译的形式重写查询,要么切换到客户端 通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用来显式评估。有关详细信息,请参阅 https://go.microsoft.com/fwlink/?linkid=2101038。
所以我想将查询更改为可翻译的查询,但我不知道是什么问题,也没有开始修复它的线索。
因此以下解决方案至少应该有效:
var searchKeys = search.KeySearch.Split(',').Select(key => key.Trim());
var queries = new List<IQueryable<Key>>();
foreach (var searchKey in searchKeys)
{
queries.Add(_dbContext.Keys.Where(k => EF.Functions.Like(k.Name,searchKey)));
}
var finalQuery = queries[0];
for (var i = 1; i < queries.Count; i++)
{
finalQuery = finalQuery.Union(queries[i]);
}
var filteredKeys = finalQuery.ToList();
我认为代码效率很低,因为它会导致多个 UNION
语句。
一个更高效的选择是构建一个表达式树 Expression<Func<Key,bool>>
,它基本上产生以下结果:.Where(k => EF.Functions.Like(k.Name,searchKey[0]) || ... || EF.Functions.Like(k.Name,searchKey[5]))
。
以上是大佬教程为你收集整理的无法翻译 EF 核心查询全部内容,希望文章能够帮你解决无法翻译 EF 核心查询所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。