【问题标题】:Linq Include method not showing up in viewmodelLinq Include 方法未显示在视图模型中
【发布时间】:2012-09-07 17:15:54
【问题描述】:

我有一个使用 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 都在工作,并将所有绑定带回该作业。所以现在我将该查询带回我的视图模型中并填充字段,就像这样..

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 都显示“枚举未产生任何结果”。

那么它是如何不返回视图模型的呢?我该怎么做才能将完整的查询结果放入视图/视图模型中以便进行更改?

【问题讨论】:

    标签: c# linq entity-framework mvvm ria


    【解决方案1】:

    在 ObjectSet 上的 Includes 不应该更高吗?像这样:

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

    【讨论】:

    • 我试过了,它在查询中双向工作,但都没有将结果返回给视图模型
    • 您是否尝试过让 ria 服务在使用 .AsEnumerable() 或 .ToList() 而不是 ObjectSet 返回值之前执行到数据库的往返行程?如果我正确理解代码,当视图调用 FirstOrDefault() 时将尝试到 Db 的往返 - 也许 ria 服务应该这样做
    • 不,我没有尝试过,但做了更多研究,我发现我的元数据服务中没有任何 [Include][Association]。这可能是主要原因吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-10
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多