C# 在Func中转换对象类型(<&燃气轮机;

C# 在Func中转换对象类型(<&燃气轮机;,c#,linq,repository-pattern,C#,Linq,Repository Pattern,我有一个repository对象,在其中封装数据存储的数据类型。我已经定义了在整个应用程序中使用的对象,在存储库中,我必须将它们映射到数据存储公开的类型。到目前为止,我有以下几点: //The class object I work with inside my code public class Class { public string Name {get; set;} } public class ClassRepository { public Class GetCla

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

//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));
        }     

    }
}
//我在代码中使用的类对象
公共课
{
公共字符串名称{get;set;}
}
公共类类存储库
{
公共类GetClass(Func查询)
{
//newQuery=将查询中的类对象转换为从数据库公开的internalClass
使用(var context=new DBEntities())
{
返回Mapper.Map(context.InternalClasses.FirstOrDefault(newQuery));
}     
}
}

我想弄明白的是如何将
Func
转换为
Func
,这样我就不必将数据资源使用的对象公开给我的代码。

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

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);
        }    
    }
}
使用AutoMapper.QueryableExtensions;
公共类类存储库
{
公共类GetClass(表达式查询)
{
使用(var context=new DBEntities())
{
返回context.InternalClasses.Project().To().FirstOrDefault(查询);
}    
}
}

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

谢谢,类是如何变成InternalClass的NM没有得到代码中Project()部分发生的情况。这正是
Project().To()
所做的。AutoMapper为传入的
类创建等效的
IQueryable
对象。如果你想知道它是如何工作的,你需要阅读AutoMapper的源代码。@Mike,在它成为项目的一部分之前,他最初编写了
QueryableExtensions
,后来AutoMapper的人将文章中的代码添加到了项目中。谢谢@Scott。我会检查一下。当你发布带有尖括号的代码时,比如你的
Func
,一定要用一个反勾“(大多数键盘上1左边的键),如果你不这样做,网站会认为你在尝试做HTML标记,并将其去掉。