我正在使用Entity Framework 4 CTP5代码第一种方法,我有一个每层次表(TPH)映射.层次结构中的某些类具有共同的属性.
public class BaseType
{
public int Id { get; set; }
}
public class A : BaseType
{
public string Customer { get; set; }
public string Order { get; set; }
}
public class B : BaseType
{
public string Customer { get; set; }
public string Article { get; set; }
}
public class C : BaseType
{
public string Article { get; set; }
public string Manufacturer { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
默认约定将此映射到以下列: …
这是问题所在:我需要返回带有过滤嵌套集合的对象集合.例如:有一个带有订单的商店,我需要返回一个包含商店的集合,这些商店包含带有订单的嵌套集合,但没有标记为已删除的客户的订单.
这是我尝试做的.但仍然没有运气.任何建议值得赞赏:)
public List<StoreEntity> GetStores(Func<Store, bool> storeFilter, Predicate<OrderEntity> orderFileter)
{
IQueryable<StoreEntity> storeEntities = Context.Stores
.Include(o => o.Order)
.Include(cu => cu.Orders.Select(c => c.Customer))
.Where(storeFilter)
//.Where(rcu=>rcu.Orders.Select(cu=>cu.Customer.Deleted==false)) //just test this doesn't work
.AsQueryable();
List<StoreEntity> storeEntities = storeEntities.ToList();
//storeEntities.ForEach(s => s.Orders.ToList().RemoveAll(c=>c.Customer.Deleted==true)); // doesn't work
foreach (StoreEntity storeEntity in storeEntities)
{
storeEntity.Orders.ToList().RemoveAll(r=>r.Customer.Deleted==true);
}
return storeEntities;
}
Run Code Online (Sandbox Code Playgroud)
问题是没有应用过滤器.已将已删除标记设置为true的客户留在集合中.
我在我的MVC应用程序中使用EF 5数据库第一种方法.我的所有表都使用一个名为Deleted的字段,这是一个标记记录被删除的布尔字段.
我试图摆脱每次查询我的数据库时必须检查Deleted == false的要求.这种非常简单的方法是在edmx文件中使用条件映射,其中EF始终返回未删除的数据.这一切都很好.
但是,这个条件映射的问题是,当我想允许用户从地址簿中删除例如地址的某些记录时,我无法访问EF中的删除字段,因为我在条件映射中使用它,因此我必须寻找另一个允许用户删除记录的选项.
我想的方法是创建一个处理删除查询的存储过程,并在我想要删除记录时调用它.
有没有更好的方法呢?是否可以使删除字段可访问,即使它在条件映射中使用?
我有一个实体,我只需要返回给定字段值大于零的记录.我在edmx中看到过条件映射的例子,这看起来像我需要的东西.但是,我的项目首先是EF 4.1代码.有没有办法使用代码第一种方法来做到这一点?