В ASP.NET MVC 3 как использовать LINQ для извлечения только тех объектов сущностей, которые мне нужны? - PullRequest
3 голосов
/ 20 октября 2011

У меня есть контроллер, который в настоящее время выглядит следующим образом:

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», которые соответствуют пользователю, который в данный момент вошел в систему.

1 Ответ

4 голосов
/ 20 октября 2011

Вы не можете смешивать поставщиков таким способом. Хотя компилятор 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 (...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...