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