繁体   English   中英

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

[英]In ASP.NET MVC 3, how do I use LINQ to retrieve only the entity objects I want?

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

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

但是当我尝试运行它时,我的View会抛出异常:

@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.

这是怎么回事? 我想要做的就是枚举每个与当前登录用户相对应的“播放器”实体。

你不能以这种方式混合提供者。 虽然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 (...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM