【问题标题】:OrderBy virtual property in entity framework实体框架中的 OrderBy 虚拟属性
【发布时间】:2017-07-28 23:28:13
【问题描述】:

是否可以orderby 实体上的虚拟属性?

我有一个类似于:

public int Id{get;set;}
public string Name {get;set;}

public virtual string TestName
{
   get { return string.Format("{0}{1}", Name , Id); }
}

当我通过 TestName 属性订购时,我得到了错误:

"指定类型成员 'TestName' 在 LINQ to 中不受支持 实体。只有初始化器、实体成员和实体导航 支持属性。”

我最初在一个部分类中拥有该方法,该属性用于返回数据但不用于排序。

有没有办法解决这个问题?

【问题讨论】:

  • 我怀疑你必须指定只读或非映射。
  • 该错误与virtual的属性无关。您收到错误是因为您调用 OrderBy 的集合是 IQueryable<T>,因此 EF 尝试从中创建 SQL。由于数据库不知道该属性,因此无法对其进行排序。

标签: c# entity-framework linq


【解决方案1】:

您必须在 EF 查询中使用 .ToList().OrderBy(x => x.TestName),而不仅仅是 .OrderBy(x => x.TestName)

这是因为TestName 属性在数据库表中不作为列存在,并且无法将查询转换为 SQL 语句。 .ToList() 调用会将查询具体化为一个 C# 集合,然后可以对其进行排序。

【讨论】:

  • 这可行,但我正在尝试对此类的大量集合进行搜索查询,而 ToList() 会影响性能
【解决方案2】:

您可以使用 DelegateDecompiler 将属性内的代码展开为表达式树,这意味着 Linq to Entities 可以从中生成 SQL。

https://github.com/hazzik/DelegateDecompiler

您只需使用[Computed] 属性装饰属性,并在linq 查询中调用.Decompile()

【讨论】:

    猜你喜欢
    • 2013-01-24
    • 2016-05-29
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多