我很好奇如何创建可由 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);
The specified type member 'Parent' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
有没有什么方法可以在不执行 .ToList() 的情况下创建可翻译的属性(LINQ to SQL)?
编辑:我想避免接触 Model.edmx,因为数据库在开发过程中经常发生变化,并且 .edmx 经常需要重新创建
最佳答案
如果您询问是否可以使用 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。
关于c# - 创建 LINQ to Entities 可以转换的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10509019/