创建 LINQ to 实体可以转换的属性

本文关键字:转换 属性 LINQ to 实体 创建 | 更新日期: 2023-09-27 18:33:45

我很好奇如何创建一个可以被 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 实体中不受支持。仅支持初始值设定项、实体成员和实体导航属性。

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

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

创建 LINQ to 实体可以转换的属性

如果您询问是否可以在 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;
        }
    }
}

然后

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

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

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

您有 4 个选项:

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