C# 在ASP.NET MVC 3中,如何使用LINQ仅检索所需的实体对象?
我有一个控制器,目前看起来像这样:C# 在ASP.NET MVC 3中,如何使用LINQ仅检索所需的实体对象?,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我有一个控制器,目前看起来像这样: public ActionResult Index() { var onlineUsers = Membership.GetAllUsers().Cast<MembershipUser>().Where(u => u.IsOnline); var onlinePlayers = from p in _db.Players join u in onlineUsers on p.us
public ActionResult Index()
{
var onlineUsers = Membership.GetAllUsers().Cast<MembershipUser>().Where(u => u.IsOnline);
var onlinePlayers = from p in _db.Players
join u in onlineUsers on p.userId equals (Guid)u.ProviderUserKey
select p;
return View(onlinePlayers);
}
var onlineKeys = Membership.GetAllusers().Cast<MembershipUser>()
.Where(u => u.IsOnline)
.Select(u => (Guid)u.ProviderUserKey)
.ToList();
var onlinePlayers = from p in _db.Players
where onlineKeys.Contains(p.userId)
发生什么事了?我要做的就是枚举与当前登录的用户对应的每个播放器实体。您不能以这种方式混合提供程序。虽然C编译器不知道它是无效的,但运行时不知道如何将LINQ与SQL实体和内存中对象混合在一起的内容转换为SQL查询,事实上,它无法将这些内容转换为SQL查询。使之真正起作用的唯一方法是使用_db.Players.AsEnumerable,但这会导致整个Player表返回并在内存中过滤,这是不好的 相反,您必须执行以下操作:
public ActionResult Index()
{
var onlineUsers = Membership.GetAllUsers().Cast<MembershipUser>().Where(u => u.IsOnline);
var onlinePlayers = from p in _db.Players
join u in onlineUsers on p.userId equals (Guid)u.ProviderUserKey
select p;
return View(onlinePlayers);
}
var onlineKeys = Membership.GetAllusers().Cast<MembershipUser>()
.Where(u => u.IsOnline)
.Select(u => (Guid)u.ProviderUserKey)
.ToList();
var onlinePlayers = from p in _db.Players
where onlineKeys.Contains(p.userId)
这将翻转包含,并执行类似于……中的where userId的操作。在我看来,在名称空间BuySell.Models中有一个名为Model的类