在ASP.NET MVC 3,我如何使用LINQ来检索我想要的实体对象

本文关键字:检索 LINQ 我想要 对象 实体 何使用 NET ASP MVC | 更新日期: 2023-09-27 18:11:52

我有一个控制器,目前看起来像这样:

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);
}

但是当我尝试运行这个时,我的视图抛出了一个异常:

@using BuySell.Models;
@model IEnumerable<BuySell.Models.Player>
@{
    ViewBag.Title = "Index";
}
...
@foreach (var item in Model) { // EXCEPTION HAPPENS HERE
    ...

错误:

Unable to create a constant value of type 'System.Web.Security.MembershipUser'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.

怎么回事?我所要做的就是枚举与当前登录的用户对应的每个"Player"实体。

在ASP.NET MVC 3,我如何使用LINQ来检索我想要的实体对象

您不能以这种方式混合提供程序。虽然c#编译器不知道它是无效的,但运行时不知道如何(实际上,不能)将混合了LINQ-to-SQL实体和内存对象的东西转换为SQL查询。实现这一点的唯一方法是使用_db.Players.AsEnumerable(),但这会导致整个Player表被带回来并在内存中过滤,即

相反,你必须这样做:

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)

这将翻转Contains,并做类似where userId in (...)