Загрузка Silverlight WCF RIA с одного предмета - PullRequest
2 голосов
/ 15 июля 2011

Здравствуйте, я немного озадачен тем, как я могу получить один «Проект» из таблицы в одном элементе вместо коллекции ...

Это моя модель представления:

public class ProjectViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    private int _loadedProjectId;
    public int LoadedProjectId
    {
        get
        {
            return _loadedProjectId;
        }
        set
        {
            if (value != _loadedProjectId)
            {
                _loadedProjectId = value;
                _Context.Load(_Context.GetProjectFromIdQuery(_loadedProjectId)); 
                PropertyChanged(this, new PropertyChangedEventArgs("LoadedProjectId"));
            }
        }
    }

    public Project loadedProject { get; set; }
    public IEnumerable<Project> Projects { get; set; }

    private myDomainContext _Context = new myDomainContext();

    public ProjectViewModel()
    {

        Projects = _Context.Projects;
        if (!DesignerProperties.IsInDesignTool)
        {
            _Context.Load(_Context.GetProjectsQuery());
        }

    }
}

Проблема здесь

_Context.Load(_Context.GetProjectFromIdQuery(_loadedProjectId)); 

, так как я не хочу загружать это в моем контексте, но я хотел бы сделать что-то вроде этого: (но, очевидно, я не могу)

loadedProject = _Context.GetProjectFromIdQuery(_loadedProjectId);

Вот запросы в моей доменной службе:

    public IQueryable<Project> GetProjects()
    {
        return this.ObjectContext.Projects;
    }

    public Project GetProjectFromId(int id)
    {
        return this.ObjectContext.Projects.SingleOrDefault(t => t.Id == id);
    }

Так я делаю это неправильно?Должен ли я просто искать проект в коллекции проектов, которые у меня уже есть?

tx, чтобы пролить свет на это!

1 Ответ

5 голосов
/ 15 июля 2011

Службы RIA работают с коллекциями, даже если ваш метод запроса возвращает только один элемент.Чтобы получить доступ к единственному элементу, вы должны использовать возвращенный экземпляр LoadOperation вызова

LoadOperation<Project> loadOperation = _Context.Load(_Context.GetProjectFromIdQuery(_loadedProjectId));

. LoadOperation предоставляет свойство Entities, которое содержит все объекты, загруженные операцией.Так что в вашем случае он содержит перечисление только с одной сущностью.

Чтобы получить сущность из коллекции, вы можете сделать это следующим образом:

Project loadedProject = loadOperation.Entities.FirstOrDefault(p=>p.Id=_loadedProjectId);

Если вы действительно не хотите добавлять загруженныеВ соответствии с вашим контекстом (что я не рекомендую) вы должны использовать Invoke-Operation, но тогда у вас нет отслеживания изменений и управления связями для загруженного объекта.

...