1

riaサービスでmvvmを使用する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は「列挙は結果を生成しませんでした」と言います。

では、どうしてビューモデルに戻らないのでしょうか。クエリ結果全体をビュー/ビューモデルに入れて変更できるようにするにはどうすればよいですか?

4

2 に答える 2

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;
    }
于 2012-09-07T17:43:46.440 に答える
0

これは、メタデータ サービスが最新のテーブルの関連付けを取得しないという問題でした。メタデータを再生成するという混乱を経た後、正しいキーを含めて関連付けるのは簡単なことでした。クイントン・ベルンハルトの努力に感謝します!

于 2012-09-07T21:04:53.280 に答える