【问题标题】:LINQ/C# - Making a DTO from a collection?LINQ/C# - 从集合中创建 DTO?
【发布时间】:2018-07-28 04:44:13
【问题描述】:

我正在使用带有 SQL 的 EF 6.2。假设我有这些 DTO 类:

private class ParentModel
{
    public string FullName { get; set; }
    public IEnumerable<ChildModel> Children { get; set; }
}
private class ChildModel
{
    public string FullName { get; set; }
    public string SpiritAnimalDescription { get; set; }
}

ParentModel 派生自实体类Parent

ChildModel来自Child,与另一个实体类SpiritAnimal有关系。请注意,我在 .EDMX 中将其更改为 Children

如您所见,SpiritAnimal 有一个 Description 字段,我试图将其检索到 ChildModel 字段 SpiritAnimalDescription

当然,Parent 具有 Child 的集合,而 Child 又具有一个 SpiritAnimal(按设计)。现在,我正在尝试使用此代码获取List&lt;ParentModel&gt;,但目前无法使用:

var query = from p in db.Parents
            join c in db.Children on p.Id equals c.Parent_Id
            join sa in db.SpiritAnimals on c.SpiritAnimal_Id equals sa.Id
            select new ParentModel
            {
                FullName = p.LastName + ", " + p.FirstName
                Children = c.Select(a => new ChildModel // <-- Error here :(
                {
                    FullName = a.FirstName + " " + a.LastName,
                    SpiritAnimalDescription = sa.Description
                }
            };

var list = query.ToList();

我怎样才能尽可能高效地解决这个问题?谢谢!

编辑:

为简洁起见,实体类看起来像这样:

private class Parent
{
    public int Id { get; set; } // PK
    public string LastName { get; set; }
    public string FirstName { get; set; }
}
private class Child
{
    public int Id { get; set; } // PK
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public int Parent_Id { get; set; } // FK
    public int SpiritAnimal_Id { get; set; } // FK
}
private class SpiritAnimal
{
    public int Id { get; set; } // PK
    public string Description { get; set; }
}

【问题讨论】:

  • 你能发布原创课程Parent,ChildSpiritAnimal。想检查是否引用了外键
  • @Sumitraj 嘿,你现在可以检查一下,变化吗?谢谢
  • which currently isn't working: 是什么意思
  • A/q 你的类没有外键引用。好的,所以我们将加入。如果有使用导航属性的外键,那将是一个班轮
  • linq 查询中 ChildModel 的错误信息是什么?

标签: c# entity-framework linq


【解决方案1】:

您的代码无法编译和运行,因此无法准确确定应该是什么。

我只能假设它应该是这样的:

var query = from p in db.Parents
            select new ParentModel
            {
                FullName = p.LastName + ", " + p.FirstName,
                Children = db.Children.Where(c => c.Parent_Id == p.Id)
                    .Select(c => new ChildModel
                    {
                        FullName = c.FirstName + " " + c.LastName,
                        SpiritAnimalDescription = db.SpiritAnimals
                            .FirstOrDefault(sa => sa.Id == c.SpiritAnimal_Id).Description
                    })
            };

注意:使用导航属性。

【讨论】:

  • 虽然大卫的回答是我稍后会实现的,但这实际上回答了这个问题。谢谢!
【解决方案2】:

应该是这样的:

var query = from p in db.Parents
        select new ParentModel()
        {
            FullName = p.LastName + ", " + p.FirstName,
            Children = p.Clildren.Select(a => new ChildModel() 
                        {
                            FullName = a.FirstName + " " + a.LastName,
                            SpiritAnimalDescription = sa.Description
                        }).ToList()
        };

【讨论】:

  • 嘿大卫,谢谢,但p.Children 并不存在。我在这里手动加入表格。 :(
  • 为什么没有导航属性?无论如何,您可以使用子查询而不是联接。
  • 谢谢。正如你所说,我最终用它们重新设计了导航属性,我认为从长远来看,这会更有帮助。虽然我最初计划手动加入所有内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多