创建 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。
如果您询问是否可以在 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 个选项:
- 首先使用代码
- 将其添加到 EDMX 设计器
- 将属性添加到 EDMX 的 CSDL 部分,向 EDMX 的 SSDL 部分添加列,然后在 EDMX 的映射部分中将它们相互映射。
- 使用 将查询放入内存中。ToList() 然后使用内部 LINQ 而不是 LINQ to Entities。