Silverlight WCF RIA从单个项目加载

use*_*283 2 c# silverlight wcf-ria-services

你好,我有点困惑的是如何从单个项目中的表中获得单个"项目"而不是集合...

这是我的viewmodel:

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());
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

问题出在这里

_Context.Load(_Context.GetProjectFromIdQuery(_loadedProjectId)); 
Run Code Online (Sandbox Code Playgroud)

因为我不想在我的上下文中加载它但我想做这样的事情:(但显然我不能)

loadedProject = _Context.GetProjectFromIdQuery(_loadedProjectId);
Run Code Online (Sandbox Code Playgroud)

以下是我的域名服务中的查询:

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

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

我这样做是错误的吗?我应该只搜索我已经拥有的项目集合中的项目吗?

tx为此揭开了光芒!

Jeh*_*hof 5

当您的查询方法只返回一个元素时,RIA Services也可以使用集合.要访问单个元素,您必须使用返回的LoadOperation <Project>实例进行调用

LoadOperation<Project> loadOperation = _Context.Load(_Context.GetProjectFromIdQuery(_loadedProjectId));
Run Code Online (Sandbox Code Playgroud)

LoadOperation提供属性实体,其中包含操作加载的所有实体.因此,在您的情况下,它包含只有一个实体的枚举.

要从集合中获取实体,您可以这样做

Project loadedProject = loadOperation.Entities.FirstOrDefault(p=>p.Id=_loadedProjectId);
Run Code Online (Sandbox Code Playgroud)

如果您真的不想将加载的实体添加到您的上下文(我不推荐),您必须使用Invoke-Operation,但是您没有对加载的实体进行更改跟踪和关联管理.