【问题标题】:Performing join using linq query in Entity Framework在实体框架中使用 linq 查询执行连接
【发布时间】:2017-04-11 16:43:15
【问题描述】:

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

【问题讨论】:

    标签: c# entity-framework linq


    【解决方案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();
    

    【讨论】:

    • 非常感谢!它似乎有效,但我确实得到了一些异常,告诉我我无法从“type System.Nullable 转换为目标类型'int'”,但似乎我可以通过添加“?? default 来解决这个问题(int)“到它给我那个例外的地方:)
    • @sunero4 这意味着您在数据库中有可以为空的字段,这些字段在您的 dto 中是不可为空的。如果满足您的需要,您可以使用默认值
    • 哦,所以最好只允许它们在 DTO 中为空?
    • @sunero4 这将是完美的解决方案,因为拥有 0 值与根本没有值是不一样的
    • 太好了,我会这样做的 :) 非常感谢您的帮助!
    猜你喜欢
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    相关资源
    最近更新 更多