我正在尝试使用linq查询中的连接从数据库中的表中选择一些数据,但我似乎无法掌握如何将其保存到我想要返回的DTO列表中。 我一直在看这篇文章,看看使用lambda表达式的方向:C# Joins/Where with Linq and Lambda但似乎那个人正试图完成一些与我不同的东西;我想比较值CPR(来自表Coworkers)和值CPR(来自表Duties)并选择所有那些Projektname(来自表Duties)等于字符串projektname。
到目前为止,我所写的方法是:
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;
}
CoworkerDTO看起来像这样:
class CoWorkerDTO
{
public string Fornavn { get; set; }
public string Efternavn { get; set; }
public int Alder { get; set; }
public string CPR { get; set; }
public decimal AntalTimer { get; set; }
}
表Coworkers有一个列对应上面的每个属性,所以我想我的问题是如何以某种方式将我得到的选择转换为CoworkerDTO列表。 对不起,很长的帖子,如果我的英语有点混乱,因为它不是我的第一语言。 在此先感谢:)
答案 0 :(得分:1)
您应该将Coworkers
实体转换为CoWorkerDTO
。您可以手动执行此操作(假设属性具有相同的名称和类型):
var dtos =
from co in context.Coworkers
join du in context.Duties on co.CPR equals du.CPR
where du.Projektname == projektname
select new CoWorkerDTO {
Fornavn = co.Fornavn,
Efternavn = co.Efternavn,
Alder = co.Alder,
CPR = co.CPR,
AntalTimer = co.AntalTimer
};
return dtos.ToList();
或者您可以使用AutoMapper Queryable Extensions之类的内容自动执行该投影:
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();