C# - 如何将Func <t,bool =“”>转换为Func <dynamic,bool =“”>?</dynamic,> </t,>

时间:2014-01-07 15:36:22

标签: c# entity-framework reflection converter func

我使用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>

1 个答案:

答案 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。