我看到很多关于这个错误的问题,但是有人可以告诉我为什么我的代码中出现了这个错误? 我的应用程序中有用户和组,他们有很多关系:
public class Group
{
[Key]
public int GId { get; set; }
public string GName { get; set; }
public virtual ICollection<UserProfile> Members { get; set; }
public Group()
{
Members = new HashSet<UserProfile>();
}
}
public class UserProfile
{
[Key]
public Guid UserId { get; set; }
[Required]
public string UserName { get; set; }
public virtual ICollection<Group> Groups { get; set; }
public UserProfile()
{
Groups = new HashSet<Group>();
}
}
我想让用户加入的所有群组将其传递给ViewBag,所以:
UserProfile user = core.Profiles.Find(1);
//ok, no error in controller, but view...
ViewBag.JoinGroups = core.Groups.Where(g => g.Members.Contains(user));
但我在View:
中收到错误@if (ViewBag.JoinGroups != null)
{
foreach (var g in ViewBag.JoinGroups)//My issue start here
{
<p>@g.GId</p>
}
}
它说:
无法创建“Project.Model.UserProfile”类型的常量值。 仅支持原始类型(例如Int32,String和Guid') 在这种情况下。
我错过了什么吗?
答案 0 :(得分:2)
消息很明确:EF Linq查询不支持传递实体。
您可以通过更改此部分来解决此问题:
UserProfile user = core.Profiles.Find(1);
ViewBag.JoinGroups = core.Groups.Where(g => g.Members.Contains(user));
为此:
ViewBag.JoinGroups = core.Groups.Where(g => g.Members.Select(x => x.UserId)
.Contains(1));
答案 1 :(得分:1)
这不是ViewBag
或其他任何内容。这只是延迟的执行陷阱:直到foreach
是执行的查询。您之前可以通过core.Groups.Where(g => g.Members.Contains(user)).ToList();
看到异常。
顺便提一下,很明显你已经在实体框架中知道了referencing non-scalar variables is not supported,但是为了完整起见,请允许我提及它。