OrderBy实体框架中的虚拟属性

时间:2017-03-08 11:50:59

标签: c# entity-framework linq

是否可以在实体上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不支持   实体。仅初始化程序,实体成员和实体导航   支持属性。"

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

有解决方法吗?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

https://github.com/hazzik/DelegateDecompiler

您只需要使用[Computed]属性修饰属性,并将.Decompile()作为linq查询的一部分进行调用。