C# 在Func中转换对象类型(<&燃气轮机;
我有一个repository对象,在其中封装数据存储的数据类型。我已经定义了在整个应用程序中使用的对象,在存储库中,我必须将它们映射到数据存储公开的类型。到目前为止,我有以下几点: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
//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
notFunc
,否则您的查询不会发生在服务器端。它仍然可以使用Func
,但您将返回网络上的所有行,然后在内存中的客户端上执行筛选。对于大型表,这将给您带来非常糟糕的性能。谢谢,类是如何变成InternalClass的NM没有得到代码中Project()部分发生的情况。这正是Project().To()
所做的。AutoMapper为传入的类创建等效的IQueryable
对象。如果你想知道它是如何工作的,你需要阅读AutoMapper的源代码。@Mike,在它成为项目的一部分之前,他最初编写了QueryableExtensions
,后来AutoMapper的人将文章中的代码添加到了项目中。谢谢@Scott。我会检查一下。当你发布带有尖括号的代码时,比如你的Func
,一定要用一个反勾“(大多数键盘上1左边的键),如果你不这样做,网站会认为你在尝试做HTML标记,并将其去掉。