1

CreateItemDCEntity Framework がメソッド を認識しないため、このコードは機能しません。指定されたエンティティCreateItemDCのデータ コントラクトを作成するモジュラー プライベート メソッドです。ItemItem データ コントラクトを返す必要があるときはいつでも、サービス全体で allを使用CreateItemDCしますが、ここでは使用できません。クライアントでクエリ基準が指定されており、ここではアクセスできないため、データベース内のProjectItemsすべてのエンティティに対してこれを行う必要があるため、配列または列挙可能へのシーケンスを実現できます。ProjectItemここでより良いオプションはありますか?RIA Services は手間をかける価値がないようです。このプロジェクトでプレーンな WCF を使用していたらよかったのにと思います。

    [Query]
    public IQueryable<ProjectItemDC> GetProjectItems()
    {
        return from projectItem in ObjectContext.ProjectItems
               select new ProjectItemDC
               {
                   ID = projectItem.ID,
                   LibraryItem = CreateItemDC(projectItem.LibraryItem),
                   LibraryItemID = projectItem.LibraryItemID,
                   ProjectID = projectItem.ProjectID,
                   Quantity = projectItem.Quantity,
                   Width = projectItem.Width,
                   Height = projectItem.Height,
                   Depth = projectItem.Depth,
                   SheetMaterialID = projectItem.SheetMaterialID,
                   BandingMaterialID = projectItem.BandingMaterialID,
                   MaterialVolume = projectItem.MaterialVolume,
                   MaterialWeight = projectItem.MaterialWeight
               };
    }

PS私はLINQとEFが大好きです。:)

4

2 に答える 2

1

プレーンな WCF を使いたい場合は、コードを次のように変更するだけで問題ありません。

[Query(IsComposable=false)]
public IEnumerable<ProjectItemDC> GetProjectItems(string myParm1, string myParm2) 
    { 
        return from projectItem in ObjectContext.ProjectItems 
               select new ProjectItemDC 
               { 
                   ID = projectItem.ID, 
                   LibraryItem = CreateItemDC(projectItem.LibraryItem), 
                   LibraryItemID = projectItem.LibraryItemID, 
                   ProjectID = projectItem.ProjectID, 
                   Quantity = projectItem.Quantity, 
                   Width = projectItem.Width, 
                   Height = projectItem.Height, 
                   Depth = projectItem.Depth, 
                   SheetMaterialID = projectItem.SheetMaterialID, 
                   BandingMaterialID = projectItem.BandingMaterialID, 
                   MaterialVolume = projectItem.MaterialVolume, 
                   MaterialWeight = projectItem.MaterialWeight 
               }.ToArray(); 
    } 

独自のフィルタリング/ソート ロジックを記述すれば完了です。はい、WCF Ria Services の動的クエリ機能は失われましたが、これはほとんど従来の WCF で得られるものですよね?

代わりに WCF Ria の動的な並べ替え/フィルター処理/グループ化が必要な場合は、WCF Ria サービスが作成する式へのアクセスを含む、いくつかの追加手順を実行する必要があります。

HTH

于 2012-08-08T10:58:56.510 に答える
0

逆に呼び出して EF にすべてのアイテムToArray()ObjectContext.ProjectItems強制的にロードさせることはできますが、クエリはクライアント上で構成できなくなります。

[Query]
public IQueryable<ProjectItemDC> GetProjectItems()
{
    return from projectItem in ObjectContext.ProjectItems.ToArray()
           select new ProjectItemDC
           {
               ID = projectItem.ID,
               LibraryItem = CreateItemDC(projectItem.LibraryItem),
               LibraryItemID = projectItem.LibraryItemID,
               ProjectID = projectItem.ProjectID,
               Quantity = projectItem.Quantity,
               Width = projectItem.Width,
               Height = projectItem.Height,
               Depth = projectItem.Depth,
               SheetMaterialID = projectItem.SheetMaterialID,
               BandingMaterialID = projectItem.BandingMaterialID,
               MaterialVolume = projectItem.MaterialVolume,
               MaterialWeight = projectItem.MaterialWeight
           };
}

編集:

コメントで述べたように、データベースからすべてのデータを一度に取得しますが、これは理想的ではありません。プライベート メソッドでを作成するためLibraryItemに、クライアントでクエリを作成することはできません。代わりに、クエリ メソッド内でフィルター処理してから、配列を作成する必要があります。

[Query]
public IQueryable<ProjectItemDC> GetProjectItems(int id, string filter, object blah)
{
    var projectItems = ObjectContext.ProjectItems.Where(...).ToArray();
    return projectItems.Select(projectItem => new ProjectItemDC{...};
}
于 2012-08-08T23:31:21.903 に答える