我遇到了该描述的问题:
EntityFramework 中发生了类型为"System.ArgumentException"的异常.dll但未在用户代码中处理。
其他信息:包含路径表达式必须引用在类型上定义的导航属性。对引用导航属性使用虚线路径,对集合导航属性使用 Select 运算符。
调用Getall
方法时出现问题
var gruppi = GroupHelper.GetAll().OrderBy(a => a.Order);
获取全部方法:
public new static ICollection<Group> GetAll()
{
using (var provider = new GroupProvider())
{
provider.QAll().Include
(a => a.RoleGroup.Select(c => c.Role)).
Include(a=>a.GroupLanguage.Select(b=>b.Language).
Where(c=>c.LanguageName=="ENG")).ToList();
}
}
GroupLanguage
和RoleGroup
的属性如下:
public class GroupLanguage
{
[Key, Column(Order = 1)]
public Guid LanguageID { get; set; }
[Key, Column(Order = 2)]
public int GroupID { get; set; }
[ForeignKey("LanguageID")]
public Language Language { get; set; }
[ForeignKey("GroupID")]
public Group Group { get; set; }
}
public class RoleGroup
{
[Key, Column(Order = 1)]
public Guid RoleId { get; set; }
[Key, Column(Order = 2)]
public int GroupId { get; set; }
[ForeignKey("RoleId")]
public Role Role { get; set; }
[ForeignKey("GroupId")]
public Group Group { get; set; }
}
知道为什么会这样吗?
不能在Include
中筛选,需要引用导航属性。删除内部的Where
调用:
public new static ICollection<Group> GetAll()
{
using (var provider = new GroupProvider())
{
provider.QAll().Include(a => a.RoleGroup.Select(c => c.Role))
.Include(a=>a.GroupLanguage.Select(b=>b.Language)).ToList();
}
}
如果你只需要加载带有LanguageName=="ENG"
GroupLanguage
,那么你应该投影你的查询,但你会失去你的实体类型,因为Linq到实体只支持对匿名对象或DTO的项目查询,例如:
public new static ICollection<GroupDTO> GetAll()
{
using (var provider = new GroupProvider())
{
provider.QAll().Include(a => a.RoleGroup.Select(c => c.Role))
.Include(a=>a.GroupLanguage.Select(b=>b.Language))
.Select(a=>new GroupDTO{GroupName=a.Name,
Language=a.GroupLanguage.Select(b=>b.Language)
.Where(c=>c.LanguageName=="ENG")})
.ToList();
}
}