Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#实体框架选择自引用多对多_C#_Entity Framework_Linq - Fatal编程技术网

C#实体框架选择自引用多对多

C#实体框架选择自引用多对多,c#,entity-framework,linq,C#,Entity Framework,Linq,我正在尝试构建一个通用的dropdownlist视图模型,其中可以包含许多下拉列表 当我使用实体框架选择dropdownlist vm并在其中选择另一个dropdownlist vm列表时,我得到一个错误。但是,如果我将代码更改为有2个VM,而不是使用1个泛型1,那么一切都可以正常工作。我试图避免额外的类,并在所有项目中保持相同的视图模型一致 错误: DropDownSelect“出现在两个结构不兼容的 在单个LINQ到实体查询中进行初始化。类型可以是 在同一查询中的两个位置初始化,但仅当 属性

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

当我使用实体框架选择dropdownlist vm并在其中选择另一个dropdownlist vm列表时,我得到一个错误。但是,如果我将代码更改为有2个VM,而不是使用1个泛型1,那么一切都可以正常工作。我试图避免额外的类,并在所有项目中保持相同的视图模型一致

错误:

DropDownSelect“出现在两个结构不兼容的 在单个LINQ到实体查询中进行初始化。类型可以是 在同一查询中的两个位置初始化,但仅当 属性在两个位置都设置,并且这些属性在 同样的顺序

视图模型:

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>();
    }
}
公共类下拉选择
{
公共int Id{get;set;}
公共字符串名称{get;set;}
下一个公共列表{get;set;}
公共选举
{
Next=新列表();
}
}
林克:

公共静态异步任务SelectReport下拉列表(bool isPpm,int companyId=0)
{
使用(var context=ContextFactory.getLiveConnection())
{
return wait context.companys.Select(c=>newdropdownselect()
{
Id=c.Id,
Name=c.Name,
Next=c.Reports.Select(p=>newdropdownselect()
{
Id=p.d,
名称=p.名称,
})托利斯先生()
}).ToListAsync();
}
}

正如错误消息中所明确指出的,Entity Framework不喜欢在查询中的两个位置使用相同的类(即,
DropDownSelect
),并且每次设置不同的属性时。也就是说,第一次设置的是
Id
Name
Next
,但第二次设置的是
Id
Name

要解决此问题,请在查询中使用,然后将其转换为
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();


    }
}
公共静态异步任务SelectReport下拉列表(bool isPpm,int companyId=0)
{
使用(var context=ContextFactory.getLiveConnection())
{
var result=await context.companys.Select(c=>new//这是一个匿名类型
{
Id=c.Id,
Name=c.Name,
Next=c.Reports.Select(p=>newdropdownselect//DropDownSelect现在只在查询中的一个位置使用
{
Id=p.d,
名称=p.名称,
})托利斯先生()
}).ToListAsync();
返回结果。选择(x=>newdropdownselect
{
Id=x.Id,
Name=x.Name,
下一个=x.下一个
}).ToList();
}
}

我可以通过web api返回匿名类型并跳过映射部分吗?这是可行的,但代码是重复的,特别是如果我要达到两个以上的级别。我认为您无法做到这一点。但就性能而言,映射所需的时间相对可以忽略不计(与数据库查询相比)。好的,如果我返回一个对象,它就可以工作,并完美地映射到json。最初我遇到一个错误,因为我试图返回一个List@MIKE,我不确定我是否理解这不是同一个问题或答案。我不同意复印件。也许你弄错了?
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();


    }
}