转换Func<;中的对象类型>;

本文关键字:对象 类型 gt lt 转换 Func | 更新日期: 2023-09-27 18:21:13

我有一个存储库对象,用于封装数据存储的数据类型。我已经定义了在整个应用程序中使用的对象,在存储库中,我必须将它们映射到数据存储公开的类型。到目前为止,我有以下内容:

//The class object I work with inside my code
public class Class
{
    public string Name {get; set;}
}
public class ClassRepository
{
    public Class GetClass(Func<Class, bool> query)
    {
         //newQuery = Do something to convert the Class object in Query to internalClass exposed from Database
        using (var context = new DBEntities())
        {
            return Mapper.Map<Class>(context.InternalClasses.FirstOrDefault(newQuery));
        }     
    }
}

我想弄清楚的是如何将Func<Class, bool>转换为Func<internalClass, bool>,这样我就不必向代码公开数据资源使用的对象。

转换Func<;中的对象类型>;

我假设您使用的是AutoMapper,不要使用带有IQueryable对象的Mapper.Map。将QueryableExtensions名称空间与其Project().To<T>()方法一起使用,它正是为这种情况而设计的。

using AutoMapper.QueryableExtensions;
public class ClassRepository
{
    public Class GetClass(Expression<Func<Class, bool>> query)
    {
        using (var context = new DBEntities())
        {
            return context.InternalClasses.Project().To<Class>().FirstOrDefault(query);
        }    
    }
}

此外,您应该传入Expression<Func<Class, bool>>而不是Func<Class, bool>,否则您的查询将不会在服务器端发生。它仍然可以使用Func<Class, bool>,但您将通过网络返回所有行,然后在内存中的客户端上执行筛选。对于大型表,这将给您带来非常糟糕的性能。