我使用Entity Framework 4,我有一个实体
public partial class UserEntity : EntityObject
{
public string id_user;
public string pass;
public DateTime date_added;
}
和具有自定义属性的数据传输对象
[DataTransferObject("UserEntity")]
public class User
{
[EntityColumn("id_user")]
public string idUser { get; set; }
[EntityColumn("pass")]
public string password { get; set; }
[EntityColumn("date_added")]
public string dateAdded { get; set; }
}
我将实体转换为dto,将dto转换为实体,使用带反射的这些属性,当我想使用Enumerable.Where
向{进行查询时,我正在使用通用存储库进行数据访问方法实体的{1}},这需要ObjectSet
(动态,因为程序不知道实现存储库的实体),这有效,但我想要一个Func<dynamic, bool>
作为参数,所以我不需要必须在业务层使用实体,有没有办法实现这样的事情?
Func<DTObject, bool>
答案 0 :(得分:2)
我需要在这里阻止你。你的方法完全错了。您需要使用Queryable.Where<T>(this IQueryable<T> query, Expression<Func<T, bool>>)
EntityFramework
才能工作。您实际使用的方法是Enumerable.Where<T>(this IEnumerable<T> set, Func<T, bool> predicate)
,它会对IN MEMORY进行过滤。这意味着你要走的路将你的整个表下载到内存中。
为此,您需要使用System.Linq.Expressions
命名空间。但是,如果这样做有效,没有一些疯狂的逻辑(比表达式已经存在的更多)。您的Dto签名与EntityObject
完全相同。
鉴于这是真的,你的DTO会增加什么价值(考虑到班级的维护费用)?
我看到的唯一值是您的域逻辑与数据存储的分离(即您的域层中没有EntityObject
)。然而,多年前POCO解决了这个问题。
TLDR
XY问题。改为使用POCO。