【发布时间】:2016-05-12 11:26:49
【问题描述】:
我正在尝试创建一个通常使用过滤器加载相关子实体的函数。
我所有的实体都派生自我自己的基类“BusinessObject”
public abstract class BusinessObject : BaseObject, IBaseObject, ILocalObject
{
[Browsable(false)]
[Key]
public int ID { get; set; }
[Browsable(false)]
public int? HqID { get; set; }
private bool _deleted;
[Browsable(false)]
public bool Deleted
{
get { return _deleted; }
set { CheckPropertyChanged(ref _deleted, value); }
}
}
我创建了以下函数,当提供一个实体时,它将加载所有相关的子对象。 在定义我的实体时,所有子集合都由我自己的属性“EntityChildCollectionAttribute”标记,因此我可以轻松找到我想要加载的集合。
public virtual void OnLoadEntityChildren(object entity)
{
var propNames = entity.GetPropertyNames();
foreach (var propName in propNames.Where(propName => entity.PropertyHasCustomAttribute(propName, typeof(EntityChildCollectionAttribute))))
{
MyData.Entry(entity).Collection(propName).Load();
}
}
这很好用! 当我想过滤子集合时,我的问题就来了。
在这种情况下,我只想加载 Deleted == false 的子实体。
我不知道该怎么做!
我进行了很多尝试并替换了 MyData.Entry(entity).Collection(propName).Load();与
MyData.Entry(entity).Collection(propName).Query().Cast<BusinessObject>().Where(x=>x.Deleted.Equals(false)).Load();
编译但是我得到了错误;
“无法将类型 'FmOrderProcessing.Entities.OpDocumentDetail' 转换为类型 'FwBaseEntityFramework.BusinessObject'。LINQ to Entities 仅支持转换 EDM 基元或枚举类型。”
我们将不胜感激地收到任何帮助/指针/答案
提前致谢
兰斯
【问题讨论】:
-
有时只写纯sql是最好的答案....如果在EF中变得太复杂,写一个sproc。
-
EF 不知道
BusinessObject。它不是映射类型。 -
对了,我想知道你为什么不用
Include。您的代码分别为每个父级加载子集合,也称为 n+1 反模式。 -
@GertArnold - “包含”是否允许您指定通用过滤器?
-
不,这是一个令人讨厌的限制。有work-araounds。
标签: c# entity-framework-6