在Entity Framework中使用linq查询执行连接

时间:2017-04-11 16:43:15

标签: c# entity-framework linq

我正在尝试使用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列表。 对不起,很长的帖子,如果我的英语有点混乱,因为它不是我的第一语言。 在此先感谢:)

1 个答案:

答案 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();