C# 在实体框架中使用linq查询执行连接
我试图在linq查询中使用联接从数据库中的表中选择一些数据,但似乎无法掌握如何将其保存到要返回的DTO列表中。 我一直在看这篇文章,寻找使用lambda表达式的方法:但似乎那个家伙正试图完成一些与我略有不同的事情;我想比较值CPR(来自表Coworkers)和值CPR(来自表职责),并选择Projektname(来自表职责)等于字符串Projektname的所有值 到目前为止,我所写的方法是:C# 在实体框架中使用linq查询执行连接,c#,entity-framework,linq,C#,Entity Framework,Linq,我试图在linq查询中使用联接从数据库中的表中选择一些数据,但似乎无法掌握如何将其保存到要返回的DTO列表中。 我一直在看这篇文章,寻找使用lambda表达式的方法:但似乎那个家伙正试图完成一些与我略有不同的事情;我想比较值CPR(来自表Coworkers)和值CPR(来自表职责),并选择Projektname(来自表职责)等于字符串Projektname的所有值 到目前为止,我所写的方法是: public List<CoworkerDTO> GetCoworkers(str
public List<CoworkerDTO> GetCoworkers(string projektname)
{
_coworkerlist = new List<CoworkerDTO>();
using (var context = new F17ST2ITS2201608275Entities())
{
var dataset =
from co in context.Coworkers
join du in context.Duties on co.CPR equals du.CPR
where du.Projektname == projektname
select new {Coworkers = co};
foreach (var element in dataset.ToList())
{
_coworkerlist.Add(element);
}
}
return _coworkerlist;
}
表Coworkers有一列对应于上面的每个属性,所以我想我的问题是如何以某种方式将我得到的选择转换为coworkerdto列表。
对不起,这篇文章太长了,如果我的英语有点混乱,因为它不是我的第一语言。
提前感谢:)您应该将
同事
实体转换为同事
实体。您可以手动执行此操作(假定属性具有相同的名称和类型):
或者,您可以使用AutoMapper之类的工具自动进行投影:
Mapper.Initialize(cfg =>
cfg.CreateMap<Coworkers, CoWorkerDTO>());
Mapper.Initialize(cfg=>
CreateMap());
带投影的查询将如下所示
var entities =
from co in context.Coworkers
join du in context.Duties on co.CPR equals du.CPR
where du.Projektname == projektname
select co;
return entities.ProjectTo<CoWorkerDTO>().ToList();
var实体=
来自上下文中的同事
在上下文中加入du。co.CPR上的职责等于du.CPR
其中du.Projektname==Projektname
选择公司;
返回entities.ProjectTo().ToList();
非常感谢!这似乎是可行的,但我确实遇到了一些异常,告诉我我无法从“type System.Nullable”转换为目标类型“int”,但似乎我可以通过将“?”default(int)”添加到它给出该异常的位置来解决这一问题:)@sunero4这意味着数据库中有可为null的字段,而这些字段在dto中不可为null。如果满足您的需要,您可以使用默认值。因此,最好允许它们在DTO?@sunero4中为空,这将是一个完美的解决方案,因为具有0
值与完全没有值并不相同。很好,我会这样做:)非常感谢您的帮助!
Mapper.Initialize(cfg =>
cfg.CreateMap<Coworkers, CoWorkerDTO>());
var entities =
from co in context.Coworkers
join du in context.Duties on co.CPR equals du.CPR
where du.Projektname == projektname
select co;
return entities.ProjectTo<CoWorkerDTO>().ToList();