【问题标题】:Map Func<Type1, bool> to Func<Type2, bool>将 Func<Type1, bool> 映射到 Func<Type2, bool>
【发布时间】:2010-10-13 01:59:15
【问题描述】:

我在一组存储库后面使用实体框架。存储库使用 DTO 而不是实体框架生成的实体对象。我正在使用 AutoMapper 来回转换它们。

我无法弄清楚如何执行以下操作:

方法定义:

public IEnumerable<DTO.User> Get(Func<DTO.User, bool> whereClause)

例子:

var users = userRepository.Get(usersWhere => usersWhere.PostCount > someNumber);

我希望能够像这样将 Func&lt;T, bool&gt; 传递给实体框架:

var users = entityFramework.Users.Where(whereClause);

显然,这不会构建,因为 .Where() 方法需要 Entities.User,而不是 DTO.User

有没有办法将Func&lt;DTO.User, bool&gt; 转换为Func&lt;Entities.User, bool&gt;

【问题讨论】:

    标签: c# entity-framework lambda automapper


    【解决方案1】:

    您可以使用Select() 方法通过强制转换、调用构造函数或其他方式执行转换。然后,您可以在 Where() 过滤器中使用您的函数,因为该集合的类型正确。

    var users = entityFramework.Users
                               .Select(user => (DTO.User)user) //perform the conversion
                               .Where(whereClause);
    

    另一种方法是创建一个具有正确类型的新函数以从内部执行转换。然后你可以使用新的 where 子句。

    Func<Entities.User, bool> newWhereClause = user => whereClause((DTO.User)user); //convert here
    

    【讨论】:

    • 我相信第二种方式是你所追求的,但我认为第一种方式是最明智的。我对 LINQ-to-Entities 不太熟悉,所以我不知道这两种方法是否按原样工作并且可能需要调整(如果它类似于 LINQ-to-SQL)。
    • 我使用了第二种方法。根据我对 Entity Framework 如何提取记录的模糊理解,第一种方法会在转换之前从数据库中提取所有 User 行。也许知道更多的人可以证实这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多