6

我很好奇如何创建一个可以由 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 不支持指定的类型成员“父级”。仅支持初始化程序、实体成员和实体导航属性。

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

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

4

3 回答 3

2

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

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

更新

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

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。

于 2012-05-09T08:43:29.103 回答
0

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

于 2012-05-09T03:48:03.900 回答
0

您有 4 个选项:

  1. 先用代码
  2. 将其添加到 EDMX 设计器
  3. 将您的属性添加到 EDMX 的 CSDL 部分,将列添加到 EDMX 的 SSDL 部分,然后在 EDMX 的映射部分将它们相互映射。
  4. 使用 .ToList() 将查询带入内存,然后使用内部 LINQ 而不是 LINQ to Entities。
于 2012-05-09T08:54:29.850 回答