0

バックグラウンド

現在、RIA サービスを使用する C# Silverlight ビジネス アプリケーションを使用しています。アプリケーションは、ADO.NET Entity Framework とドメイン サービス クラスを使用して ASP.NET でホストされ、SQL Server データベースの読み取りと書き込みを行います。

RIA クラスはテーブル間の複数の をサポートしていないためJOIN、ドメイン サービスの一部として LINQ をJOINすべてのテーブルにまとめて実装し、結果を返す必要がありました。

問題

foreach返されたオブジェクトのリストでループを使用しようとすると、エラー メッセージが表示されます。

GetEnumerator のパブリック定義が含まれていません

このメソッドからデータを取得するためのオプションは何ですか?

ほとんどの場合、必要なオブジェクトは 1 つだけなので、メソッドを変更して最初の結果を選択し、単一のオブジェクトを返すことができます。

このメソッドはドメイン サービス クラスに存在します。このメソッドは、コンテキストを定義してから、Silverlight クライアントでメソッドを呼び出します。

Silverlight クライアントからのメソッド呼び出し

var context = dds.DomainContext as InmZenDomainContext;
context.GetJobImagesQuery(imageJob.JobID.ToString())

サーバー側の Linq クエリ メソッド (ドメイン サービス クラス内に存在)

public List<Image> GetJobImages(string jobGuid)
{
    var query =
        (
            from j in Context.Job
            orderby (j.ShortCode)
            where j.JobID.Equals(jobGuid)
            join a in Context.Audit //.Distinct()
            on j.JobID equals a.Job.JobID
            join i in Context.Image
            on a.Image.JobID equals i.JobID
            //join s in Context.States
            //on z.States.StateID equals s.StateID
            select new Image
            {
                //ShortCode = j.ShortCode,
                HighResUrl = i.HighResUrl,
                LowResUrl = i.LowResUrl,
                UploadDate = i.UploadDate
            }
        ).ToList();
    return query;
}

呼び出し方法

var context = dds.DomainContext as InmZenDomainContext;
foreach (var item in context.GetJobImagesQuery(imageJob.JobID.ToString()))
{

}

GetJobImagesQuery宣言 (生成されたコード ファイル - .Web.g.cs 内に存在):

/// <summary>
/// Returns an EntityQuery for query operation 'GetJobImages'.
/// </summary>
public EntityQuery<Image> GetJobImagesQuery(string jobGuid)
{
    Dictionary<string, object> parameters = new Dictionary<string, object>();
    parameters.Add("jobGuid", jobGuid);
    return base.CreateQuery<Image>("GetJobImages", parameters, false, true);
}
4

3 に答える 3

1

GetJobImagesQuery は、GetJobImages 関数によって生成されるメソッドです。あなたのメソッドは、画像のリストを返すのではなく、エンティティ オブジェクトの IQueryable リストを返すことになっています。

例えば:

public IQueryable<TableName> GetTableByID(long otherTable_ID)
{
    return this.Context.TableName.Where((x) => x.otherTable_ID == otherTable_ID);
}

次のように生成されます。

public EntityQuery<TableName> GetTableNameByRx_IDQuery(long otherTable_ID)
{
    Dictionary<string, object> parameters = new Dictionary<string, object>();
    parameters.Add("otherTable_ID", otherTable_ID);
    return base.CreateQuery<TableName>("GetTableNameByotherTable_ID", parameters, false, true);
}

GetJobImages の戻り値の型を「Image」型の IQueryable に変更すると、foreach で画像を取得できると思います。

public List<Image> GetJobImages(string jobGuid)

次のようになります。

public IQueryable<Image> GetJobImages(string jobGuid)

あなたのコード:

foreach (var item in context.GetJobImagesQuery(imageJob.JobID.ToString()))

動作します。

于 2009-09-25T18:28:13.923 に答える
0

さて、あなたのメソッドは何を返しますか? IEnumerable実装されていない、または何をサポートしているのIEnumerable<T>かわかりませんが、ある種のリストのように思えます。

于 2009-09-24T09:53:56.553 に答える
0

RIA サービスは、すべての Silverlight 通信と同様に非同期です。パターンも間違っています。context.getJobImagesQuery(imageJob.JobID.ToString()) を直接使用することはできません。ロード操作で使用する必要があります。Load は非同期で、LoadOperation オブジェクトを返します。返されたエンティティにバインドする計画の場合、通常、バインディングをすぐに LoadOperation.Entities に設定するパターンになります。戻り値は INotifyCollectionChanged を使用したため、ロードが完了するとバインディングも自動的に更新されます。あなたの場合、返されたエンティティを介して foreach を実行したいので、その場合のパターンは次のようになります。

    context.Load(context.getJobImagesQuery(imageJob.JobID.ToString()), OnImagesLoaded, null);


private void OnImagesLoaded(LoadOperation lo)
{
  foreach (var item in lo.entities)
 {
 }
}

編集: どの CTP を使用していますか? コードがまったく意味をなさないためには、おそらく非常に古いバージョンの RIA Services を使用していることに気付きました。7 月の CTP を使用する必要があります。

于 2009-09-30T15:50:32.397 に答える