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

时间:2012-05-09 02:15:42

标签: c# .net entity-framework linq-to-entities

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

我有一个表/类Category,其中有一列ParentId链接到自身(因此类别可以包含子类别)

EF会自动生成属性Category1,这是父类别。

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

public partial class Category
{
  public Category Parent
  {
    get { return Category1; }
  }
}

问题是,这是有效的

var categs = ctx.Categories.Where(x => x.Category1 == null);

但这不起作用

var categs = ctx.Categories.Where(x => x.Parent == null);
  

LINQ to Entities不支持指定的类型成员“Parent”。仅支持初始化程序,实体成员和实体导航属性。

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

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

3 个答案:

答案 0 :(得分:2)

如果你问是否可以在getter / setter中创建一个带有任何C#代码的属性,然后通过标准的LINQ to Entities来理解它 - 那么不,它就无法完成。 C#比SQL更具表现力,期望Entity Framework充当一般的C#到SQL转换器是不合理的。

您可以解决此问题,但请参阅Using a partial class property inside LINQ statement以获取示例。

<强>更新

如果你告诉我们你想要达到什么目标会有所帮助,但这是一个例子:

public partial class Category
{
    public static Expression<Func<Category, bool>> ParentIsNullExpression
    {
        get 
        {
            return c => c.Category1 == null;
        }
    }
}

然后

var categs = ctx.Categories.Where(Category.ParentIsNullExpression);

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

答案 1 :(得分:0)

在您的实体数据模型设计器(.edmx文件)中,您可以将Category1重命名为Parent

答案 2 :(得分:0)

您有4个选项:

  1. 首先使用代码
  2. 将其添加到EDMX设计器
  3. 将您的属性添加到EDMX的CSDL部分,将一列添加到EDMX的SSDL部分,然后在EDMX的映射部分中将它们相互映射。
  4. 使用.ToList()将查询带入内存,然后使用内部LINQ而不是LINQ to Entities。