2012-03-29 4 views
1

は、たとえば、WHO_TYPES、私はIDWHO_TYPE_NAMEに列を制限したいです。WCF OData Servicesで出力列をフィルタリングする方法は?指定されたエンティティセットの場合

実体が公開されて自分自身を設定し、経由:

config.SetEntitySetAccessRule("WHO_TYPES", EntitySetRights.AllRead); 

...ので、私は、エンティティ/テーブルアクセスルールを設定するときにこれを行う方法を見ることができません。これを達成するためにQueryInterceptorを記述することは可能ですか?もしそうなら、どうですか?

私が作った別の試みは、カスタムオブジェクトを参照するカスタムメソッドを書くことです:

[DataServiceKey("MY_WHO_TYPES")] 
public partial class MY_WHO_TYPES 
{ 
    public MY_WHO_TYPES() { } 

    public int MY_WID { get; set; } 
    public string MY_WNAME { get; set; } 
} 

私のカスタムメソッド:この試みでは

[WebGet] 
    public IQueryable<MY_WHO_TYPES> GetWhoTypesCustom() 
    { 
     var whoCustom = from w in this.CurrentDataSource.WHO_TYPES 
         select new MY_WHO_TYPES() { MY_WID = w.ID, MY_WNAME = w.WHO_TYPE_NAME }; 

     return whoCustom.AsQueryable<MY_WHO_TYPES>(); 
    } 

、私は次のエラーメッセージが表示されます:

Unable to load metadata for return type 'System.Linq.IQueryable`1[DAL.Models.MY_WHO_TYPES]' of method 'System.Linq.IQueryable`1[DAL.Models.MY_WHO_TYPES] GetWhoTypesCustom()'. 

私はある種のリポジトリパターンが応答bu私はこれがもっと簡単になると思っています。

タプルを使用してのsuggestionは良い音が、私はそれを実装する方法や戻り値の型がどうなるかはかなりよく分からない:

:私は単に匿名型を返す試みた

select new { Tuple<int, string> (w.ID, w.WHO_TYPE_NAME)}; // error: Invalid anonymous type member declarator. Anonymous type members must be declared with a memeber assignment... 

[WebGet] 
    public IQueryable GetWhoTypesCustom() 
    { 
     var whoCustom = from w in this.CurrentDataSource.WHO_TYPES 
         select new { w.ID, w.WHO_TYPE_NAME }; 
     return whoCustom; 
    } 

この問題は、IQueryable型が定義されていないことを示すエラーが発生することです。

答えて

1

これを行う最も簡単な方法は、実際のエンティティ自体ではなくストアドプロシージャを使用することです。

これには、sprocから複合型を作成することが含まれます。 sprocに返すカラムを定義し、エンティティを作成するときに複雑なオブジェクトを作成します。 * .edmxビューから

Right-click/Add/Function Import 
Select the sproc 
Give it a Function Import Name 
Click Get Column Information 
Click Create New Complex Type - give it a name (by default looks like [Function Import Name]_Result 

動作するはずですが、ブラウザでURLに移動すると、データを示しているが、消費したときにサービスを、消費したときに、いくつかの問題があると思われることアプリケーションでは、サービストレースログにエラーが表示されます(Configuration evaluation context not found)。これは別の質問で対処されています。

ただし、sprocの1つのエンティティへの1:1フィールドマッピングの場合、上記の手順では、新しい複合タイプを選択する代わりに、エンティティと一致するエンティティを選択してください。両方の場合(URLナビゲーションと消費)。 (複合型を返すことができない)が見つかり

class Program 
{ 
    static void Main(string[] args) 
    { 
     DataServiceContext context = new DataServiceContext(new Uri("http://localhost:50100/DataService1.svc/")); 
     IEnumerable<WHO_TYPES> result = context.Execute<WHO_TYPES>(new Uri("http://localhost:50100/DataService1.svc/GetDataWhoTypesSproc")); 
     foreach (WHO_TYPES w in result) 
     { 
      Console.WriteLine(w.ID + "\t" + w.WHO_TYPE_NAME + "\t" + w.CREATED_DATE); 
     } 

     Console.Read(); 
    } 
} 

問題はthis問題の何を根本的な原因であると思われ、より正確hereに対処しています。