Linq包含未在viewmodel中显示的方法

时间:2012-09-07 17:15:55

标签: c# linq entity-framework mvvm ria

我有一个使用mvvm和ria服务的Silverlight应用程序。我在视图上有一个文本框,用户输入一个工作号并点击查找。这个查找按钮使用xaml中的ICommand来到这里..

public ICommand FindJob
{
    get
    {
        return new DelegateCommand(BeginFindJob, (o) => true);
    }
}

public void BeginFindJob(object o)
{
    if (!IsDesignTime)
    {
        IsLoading = true;
        string jobnum = o.ToString();
        OnPropertyChanged("IsLoading");
        LoadOperation<Job> loadOp = _context.Load<Job>(_context.GetJobsByJobNumQuery(jobnum));
        loadOp.Completed += new EventHandler(loadOp_Completed);
    }
}

它在我的ria服务中使用了GetJobsByJobNumQuery,就像这样..

public IQueryable<Job> GetJobsByJobNum(string JobNum)
{
    var query = ((from j in this.ObjectContext.Jobs
                  where j.JobNumber == JobNum
                  select j) as ObjectQuery<Job>).Include("JobHeadings").Include("JobContracts").Include("JobTags").Include("JobMarket"); 
    return query;
}

我希望它返回有关作业的所有信息,所以我写了上面的查询以包含所有这些关系。在linq查询上放置一个断点并查看结果,它正是我所不知道的。所有字段,JobHeadings和Contracts都在工作,并将所有绑定带回该工作。所以现在我把这个查询带回我的viewmodel并填充字段,就像这样......

void loadOp_Completed(object sender, EventArgs e)
{
    try
    {
        LoadOperation<Job> loadOp = sender as LoadOperation<Job>;
        if (!loadOp.HasError)
        {
            _job = loadOp.Entities.FirstOrDefault<Job>();

            base.IsLoading = false;
            base.ProgressBarVisibility = Visibility.Collapsed;
            base.OnPropertyChanged("IsLoading");
            base.OnPropertyChanged("ProgressBarVisibility");
            base.OnPropertyChanged("CurrentJob");
        }
    }
    catch (Exception ex)
    {
    }
}

我的问题是,没有关系数据回来。所有基本的作业信息都从我的数据库中的作业表返回,但相关表中的信息都没有返回到我的视图模型中。将bp放入并查看应该包含所有内容的_job,所有关系表JobHeading / JobContract都说'枚举没有产生任何结果'。

那么它是如何不回溯到viewmodel的呢?我该怎么做才能将完整的查询结果放入view / viewmodel中,以便我可以进行更改?

2 个答案:

答案 0 :(得分:1)

如果包含不高于ObjectSet?像这样:

public IQueryable<Job> GetJobsByJobNum(string JobNum)
    {
        var query = ((from j in this.ObjectContext.Jobs.Include("JobHeadings").Include("JobContracts").Include("JobTags").Include("JobMarket")
                      where j.JobNumber == JobNum
                      select j) as ObjectQuery<Job>); 
        return query;
    }

答案 1 :(得分:0)

这是元数据服务没有获取我最新的表关联的问题。在我经历了重新生成元数据的混乱之后,包含和关联正确的密钥是一件简单的事情。谢谢Quinton Bernhardt的努力!