C#Entity Framework选择自引用多对多

时间:2015-11-27 20:43:07

标签: c# entity-framework linq

我正在尝试构建一个通用的下拉列表视图模型,其中包含许多下拉列表。

当我使用Entity Framework选择下拉列表vm并在其中选择另一个dropdownlist vm列表时,我收到错误。但是,如果我将代码更改为2个vms而不是使用1个通用1,则一切正常。我试图避免额外的类,并在我的所有项目中保持相同的视图模型。

错误:

  

DropDownSelect'出现在两个结构上不相容的   单个LINQ to Entities查询中的初始化。一种类型可以   在同一查询中的两个地方初始化,但仅在相同的情况下   属性在两个位置都设置,并且这些属性在中设置   同样的顺序。

视图模型:

public class DropDownSelect
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<DropDownSelect> Next { get; set; }

    public DropDownSelect()
    {
        Next = new List<DropDownSelect>();
    }
}

的LINQ:

public static async Task<List<DropDownSelect>> SelectReportDropDown(bool isPpm, int companyId = 0)
{
    using (var context = ContextFactory.getLiveConnection())
    {
        return await context.Companies.Select(c => new DropDownSelect()
        {
            Id = c.ID,
            Name = c.Name,
            Next = c.Reports.Select(p => new DropDownSelect()
            {
                Id = p.ProjectId,
                Name = p.Name,
            }).ToList()
        }).ToListAsync();
    }
}

1 个答案:

答案 0 :(得分:2)

如错误消息中所述,实体框架不喜欢您在查询内的两个位置使用相同类(即DropDownSelect)并且每次设置不同属性的事实。也就是说,您第一次设置IdNameNext,但第二次只设置IdName

要解决此问题,请在查询中使用anonymous type,然后将其转换为DropDownSelect,如下所示:

public static async Task<List<DropDownSelect>> SelectReportDropDown(bool isPpm, int companyId = 0)
{
    using (var context = ContextFactory.getLiveConnection())
    {
        var result = await context.Companies.Select(c => new // this is an anonymous type
        {
            Id = c.ID,
            Name = c.Name,
            Next = c.Reports.Select(p => new DropDownSelect //DropDownSelect is now used in only one place in the query
            {
                Id = p.ProjectId,
                Name = p.Name,
            }).ToList()
        }).ToListAsync();

        return result.Select(x => new DropDownSelect
        {
            Id = x.Id,
            Name = x.Name,
            Next = x.Next
        }).ToList();


    }
}