我很好奇如何创建一个可以由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经常需要重新创建
答案 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个选项: