首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法翻译querying LINQ表达式的通用实现

无法翻译querying LINQ表达式的通用实现
EN

Stack Overflow用户
提问于 2021-05-04 17:12:30
回答 1查看 307关注 0票数 2

我正在研究在c#中使用ef core和linq查询和分页数据的通用实现。我知道不是所有的东西都可以从linq转换成sql,但我仍然觉得我错过了一些东西,而我试图实现的东西实际上是可能的。我使用QueryProperty为所有实体创建了一个基类

代码语言:javascript
复制
public class EntityBase
{
    public abstract string QueryProperty { get; }
}

每个实体都会覆盖此属性,并引导我们找到要搜索的属性。

代码语言:javascript
复制
public class ChildEntity : EntityBase
{
    public string Name { get; set; }
    public override string QueryProperty => Name;
}

这是我用来查询和分页的方法

代码语言:javascript
复制
private IQueryable<TEntity> Paginate<TEntity>(IQueryable<TEntity> queryable, PaginationArguments arguments) where TEntity : EntityBase
    {
        return queryable
            .Where(q => q.QueryProperty.Contains(arguments.Query))
            .Skip((arguments.Page - 1) * arguments.PerPage).Take(arguments.PerPage);
    }

这种实现会导致The LINQ expression could not be translated.异常。完整的例外:

System.InvalidOperationException: The LINQ expression 'DbSet<ChildEntity>.Where(l => l.QueryProperty.Contains("new"))' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

有人知道我错过了什么吗?或者用这种方式查询数据是不可能的?如果有任何其他方法可以达到预期的结果,我将不胜感激地指出。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-04 17:30:09

不能以这种方式查询。

因为EF Core查询翻译器在运行时看到的全部内容是

代码语言:javascript
复制
public abstract string QueryProperty { get; }

并且没有办法看到这一点(实现)

代码语言:javascript
复制
=> Name;

因为它无法访问源代码。它所拥有的只是用于查找属性定义(例如名称和类型)的反射,而不是实现-您可以自己尝试。

请记住,查询转换不会创建实体实例(从而执行代码)-它只使用来自类的元数据、数据注释和流畅的映射来生成服务器端查询(SQL)。

您必须找到另一种方法来提供该信息,而不是使用实体OOP技术。它可以是一个描述TEntity的单独类,也可以是某个属性标记(带有自定义属性),它在最后应该给出要在搜索中使用的Expression<Func<TEntity, string>>string属性名称。在前一种情况下,您将动态地(使用Expression类)编写表达式

代码语言:javascript
复制
q.{Actual_Property_Name}.Contains(arguments.Query)

之后,您将使用专门提供的EF.Property方法

代码语言:javascript
复制
EF.Property<string>(q, Actual_Property_Name).Contains(arguments.Query)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67381873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档