将Func <tsource,bool =“”>谓词转换为Func <tdest,bool =“”>谓词

时间:2017-07-21 22:06:20

标签: c# linq

我有一个数据层,通过接受&amp; amp;来抽象出底层实现(Entity Framework)。返回其他地方定义的模型。我希望能够将Func<T, bool>谓词传递给其中一个方法,以便在查询数据库时允许应用其他子句。

由于泛型模型对底层实体框架实现一无所知,因此我需要将Func<T, bool>谓词转换为可应用于实体框架上下文的谓词。

通用型号&amp;实体框架模型具有完全相同的属性名称&amp;我已经有一个类来执行两者之间的属性值映射。有没有办法将通用模型委托的目标类型转换为实体框架模型的目标类型?

我正在尝试做的一个例子: 鉴于此代表:func = Func<Schema.Data.Order, bool> 我想将其转换为:dbFunc = Func<Models.Order, bool> 并将其应用于上下文:ctx.Orders.Where(dbDel)

我发现了this帖子,但我无法拼凑如何执行转换。整个晚上都碰到了我的头,所以任何帮助都会非常感激!

更新

原始问题&amp;要求似乎有点模糊,所以我将详细说明我的实施和我的要求。以下代码示例已修改为使用Expression<Func<TIn, TOut>>&amp;不是Func<TIn, TOut>,基于来自hvd&amp; amp;克塞。

我有一个界面&amp;一组代表我的数据层的类。它们充当数据源的外观,允许不同的实现以访问数据库。我希望能够通过其他过滤条件作为谓词&amp;将此应用于基础数据源。但由于façade与底层实现是分开的,因此谓词是使用façade模型类定义的。此外,façade模型类属性具有与我的实现相同的命名,因此可以使用反射进行直接属性分配。

我的外观实施:

namespace Schema.Data
{
    public interface IDataStore
    {
        public IEnumerable<Order> GetOrders(string custCode, Expression<Func<Order, bool>> exp);
    }

    public class Order
    {
        public string CustomerCode { get; set; }
        public string OrderNumber { get; set; }
    }
}
然后,我在单独的命名空间中实现接口,使用Entity Framework查询我的数据库:

namespace Data.EF
{
    // Entity Framework model is in this same namespace

    public class DataStore : Schema.Data.IDataStore
    {
        public IEnumerable<Schema.Data.Order> GetOrders(string custCode, Expression<Func<Schema.Data.Order, bool>> exp)
        {
            using (var ctx = new MyDatabaseEntities()) {
                // TODO: Convert "exp" to Expression<Func<Data.EF.Order, bool>> to pass it in below
                var orders = ctx.Orders.Where(e => e.CustomerCode == custCode).Where(dbExp ?? (n => true));

                // handling the retrieved data & returning result goes here
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

如果您只需要将一种类型的函数转换为另一种类型的函数,请使用常规组合方法 -

Expression

映射可以通过手工,反射,库或许多其他方法完成 - How to map properties of two different objects?

请注意,如果您确实需要将此方法传递给EF,则需要Func而不是{{1}} - 在这种情况下,实际上可以使用目标类型重写表达式 - How to change a type in an expression tree?