我正在尝试构建一个通用的下拉列表视图模型,其中包含许多下拉列表。
当我使用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();
}
}
答案 0 :(得分:2)
如错误消息中所述,实体框架不喜欢您在查询内的两个位置使用相同类(即DropDownSelect
)并且每次设置不同属性的事实。也就是说,您第一次设置Id
,Name
和Next
,但第二次只设置Id
和Name
。
要解决此问题,请在查询中使用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();
}
}