创建LINQ to Entities可以翻译的属性

Axi*_*ili 6 .net c# linq-to-entities entity-framework

我很好奇如何创建一个可以由LINQ翻译的属性.下面是一个非常简单的例子.

我有一个表/类Category,它有一个ParentId链接到自己的列(所以一个类别可以有子类别)

EF自动生成属性Category1,即父类.

为了清楚起见,我创建了另一个属性

public partial class Category
{
  public Category Parent
  {
    get { return Category1; }
  }
}
Run Code Online (Sandbox Code Playgroud)

问题是,这是有效的

var categs = ctx.Categories.Where(x => x.Category1 == null);
Run Code Online (Sandbox Code Playgroud)

但这不起作用

var categs = ctx.Categories.Where(x => x.Parent == null);
Run Code Online (Sandbox Code Playgroud)

LINQ to Entities不支持指定的类型成员"Parent".仅支持初始值设定项,实体成员和实体导航属性.

有没有办法在不做.ToList()的情况下创建可翻译属性(LINQ to SQL)?

编辑:我想避免触及Model.edmx,因为数据库经常在开发过程中发生变化,而.edmx经常需要重新创建

Jac*_*goń 2

如果您询问是否可以在 getter/setter 中使用任何 C# 代码创建一个属性,然后让标准 LINQ to Entities 理解它 - 那么不,这是不可能的。C# 比 SQL 更具表现力,期望实体框架充当通用 C# 到 SQL 转换器是不合理的。

不过,在很多情况下您都可以解决这个问题,请参阅在 LINQ 语句中使用分部类属性作为示例。

更新

如果您告诉我们您到底想要实现什么目标,将会有所帮助,但这里有一个示例:

public partial class Category
{
    public static Expression<Func<Category, bool>> ParentIsNullExpression
    {
        get 
        {
            return c => c.Category1 == null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

进而

var categs = ctx.Categories.Where(Category.ParentIsNullExpression);
Run Code Online (Sandbox Code Playgroud)

对表达式进行各种操作都是可能的,其中一些受 EF 支持,因此可以转换为 SQL。