RIA Services и загрузка MVVM, вопрос о запросе данных (разделение данных) - PullRequest
0 голосов
/ 31 августа 2010

Прежде всего, извините за плохой заголовок, я могу только описать проблему

Допустим, в базе данных на сервере есть таблица / тип с именем Tasks. и эти задачи могут принадлежать пользователю и назначаться пользователю.

SomeTask.Owner = SomeUser
SomeTask.Assignee = SomeOtherUser

На сервере определены некоторые дополнительные запросы:

public IQueryable<Task> GetAssignedTasks(int UserId) { /* gets the assigned tasks */ };
public IQueryable<Task> GetOwnedTasks(int UserId) { /* gets the owned tasks */ };

В ViewModel они могут быть загружены следующим образом:

var ownedTasksQuery = context.GetOwnedTasksQuery(userId);
context.Load(ownedTasksQuery);

var assignedTasksQuery = context.GetAssignedTasksQuery(userId);
context.Load(assignedTasksQuery);

Проблема здесь в том, что оба результата загружаются в контекст, т.е. context.Tasks содержит объединение результатов обоих запросов

Моей первой мыслью было просто изменить геттер для свойств в моей VieWModel:

public IEnumerable<Task> OwnedTasks
{
    get { return context.Tasks.Where(t => t.UserId == userId); }    
}

public IEnumerable<Task> AssignedTasks
{
    get { return context.Tasks.Where(t => t.UserId == userId); }
}

Однако, когда я связываю представление с этими свойствами, ничего не возвращается, тогда как если я буду использовать следующее, все загруженные записи будут возвращены (очевидно):

public IEnumerable<Task> OwnedTasks
{
    get { return context.Tasks; }    
}

public IEnumerable<Task> AssignedTasks
{
    get { return context.Tasks; }
}

Полагаю, я поступаю совершенно неправильно, Как правильно справиться с такой ситуацией?

Обновление: или я должен просто обработать это, создав другой экземпляр контекста?

Обновление: похоже, я поступил неправильно ... Я все еще думаю о классификации запросов к базе данных ...

Все, что мне нужно сделать, чтобы решить мою проблему, это загрузить Пользователя, включая назначенные и собственные задачи ...

ObjectContext.Users.Include("OwnedTasks").Include("AssignedTasks")

Сделает это сообщество вики, если кто-то другой сделает то же самое.

1 Ответ

0 голосов
/ 31 августа 2010

Вы хотели поставить Где (t => t.UserId = userId) или вы имели в виду:

Where(t => t.UserId == userId);

т.е. Вы использовали оператор присваивания вместо сравнения. (LINQ преобразует "==" в "=" в SQL за кулисами, но вы должны использовать операторы C #).

...