我有一个存储库对象,我在其中封装了我的数据存储的数据类型。我已经定义了在整个应用程序中使用的对象,并且在存储库中,我必须将它们映射到数据存储公开的类型。到目前为止,我有以下内容:
//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>
,以便我不必将数据资源使用的对象公开给我的代码。
答案 0 :(得分:2)
我假设你使用的是AutoMapper,不要将Mapper.Map与IQueryable对象一起使用。使用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>
一起使用,但您将通过网络返回所有行,然后在内存中的客户端上执行过滤器。这会给大型表带来非常糟糕的性能。