[英]How do I insert and retrieve geography data in asp.net mvc connected with Entity Framework and using dapper?
[英]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.