程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了无法翻译 EF 核心查询大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决无法翻译 EF 核心查询?

开发过程中遇到无法翻译 EF 核心查询的问题如何解决?下面主要结合日常开发的经验,给出你关于无法翻译 EF 核心查询的解决方法建议,希望对你解决无法翻译 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,请注明来意。
标签: