C# 实体框架,具有where条件的相关实体的通用加载
我正在尝试创建一个函数,该函数一般使用过滤器加载相关的子实体 我的所有实体都派生自我自己的基类“BusinessObject” 我创建了以下函数,当提供该函数时,实体将加载所有相关的子对象。 定义实体时,所有子集合都由我自己的属性“EntityChildCollectionAttribute”标记,因此我可以轻松找到要加载的集合C# 实体框架,具有where条件的相关实体的通用加载,c#,entity-framework-6,C#,Entity Framework 6,我正在尝试创建一个函数,该函数一般使用过滤器加载相关的子实体 我的所有实体都派生自我自己的基类“BusinessObject” 我创建了以下函数,当提供该函数时,实体将加载所有相关的子对象。 定义实体时,所有子集合都由我自己的属性“EntityChildCollectionAttribute”标记,因此我可以轻松找到要加载的集合 public virtual void OnLoadEntityChildren(object entity) { var propNa
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().Where(x=>x.Deleted.Equals(false)).Load();
编译,但我得到了错误
无法将类型“FmOrderProcessing.Entities.OpDocumentDetail”强制转换为类型“FwBaseEntityFramework.BusinessObject”。LINQ to Entities仅支持强制转换EDM基元或枚举类型
如有任何帮助/建议/答案,我们将不胜感激
提前谢谢
Lance我正在实施一种“软删除”模式,这意味着数据库中的记录被标记为已删除而不是已删除(用于审计和复制目的)
所有实体都是从具有bool Deleted属性的基础定义派生的
我在这里找到了答案:
此包允许在数据上下文中定义全局筛选器。
我用OnModelCreating覆盖中的一行代码修复了我的问题
modelBuilder.Filter("Deleted", (IBaseObject d) =>d.Deleted, false);
filter函数全局应用于显示(在我的例子中)IBaseObject接口的任何实体
我希望这能帮助其他任何有类似问题的机构我正在实施一种“软删除”模式,这意味着数据库中的记录被标记为已删除,而不是已删除(用于审计和复制目的)
所有实体都是从具有bool Deleted属性的基础定义派生的
我在这里找到了答案:
此包允许在数据上下文中定义全局筛选器。
我用OnModelCreating覆盖中的一行代码修复了我的问题
modelBuilder.Filter("Deleted", (IBaseObject d) =>d.Deleted, false);
filter函数全局应用于显示(在我的例子中)IBaseObject接口的任何实体
我希望这能帮助其他有类似问题的人有时候编写纯sql是最好的答案。。。。如果在EF中变得太复杂,请编写一个存储过程。EF不知道
BusinessObject
。它不是映射类型。顺便问一下,我想知道你为什么不使用Include
。您的代码分别为每个父级加载子集合,也称为n+1反模式。@GertArnold-是否“包含”允许您指定通用筛选器?不,这是一个恼人的限制。有。有时候,编写纯sql是最好的答案。。。。如果在EF中变得太复杂,请编写一个存储过程。EF不知道BusinessObject
。它不是映射类型。顺便问一下,我想知道你为什么不使用Include
。您的代码分别为每个父级加载子集合,也称为n+1反模式。@GertArnold-是否“包含”允许您指定通用筛选器?不,这是一个恼人的限制。有。
modelBuilder.Filter("Deleted", (IBaseObject d) =>d.Deleted, false);