gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:42:00 27 4
gpt4 key购买 nike

我有一个目前看起来像这样的 Controller :

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 (...) 的操作。

关于c# - 在 ASP.NET MVC 3 中,如何使用 LINQ 只检索我想要的实体对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7831089/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com