在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"实体。
您不能以这种方式混合提供程序。虽然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 (...)
。