Axi*_*ili 6 .net c# linq-to-entities entity-framework
我很好奇如何创建一个可以由LINQ翻译的属性.下面是一个非常简单的例子.
我有一个表/类Category,它有一个ParentId链接到自己的列(所以一个类别可以有子类别)
EF自动生成属性Category1,即父类.
为了清楚起见,我创建了另一个属性
public partial class Category
{
public Category Parent
{
get { return Category1; }
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,这是有效的
var categs = ctx.Categories.Where(x => x.Category1 == null);
Run Code Online (Sandbox Code Playgroud)
但这不起作用
var categs = ctx.Categories.Where(x => x.Parent == null);
Run Code Online (Sandbox Code Playgroud)
LINQ to Entities不支持指定的类型成员"Parent".仅支持初始值设定项,实体成员和实体导航属性.
有没有办法在不做.ToList()的情况下创建可翻译属性(LINQ to SQL)?
编辑:我想避免触及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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
进而
var categs = ctx.Categories.Where(Category.ParentIsNullExpression);
Run Code Online (Sandbox Code Playgroud)
对表达式进行各种操作都是可能的,其中一些受 EF 支持,因此可以转换为 SQL。