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的类