2016-05-10 14 views
0

TransactionTypesと呼ばれる、という名前のプロパティを持つエンティティAccountActionがあります。TransactionTypeエンティティです。ODataに相当するLINQのSelectMany

というメソッドですべてのAccountActionsに関連するすべてのTransactionTypesのリストを返します。 TransactionTypesの返されたリストにクエリオプションを適用したいと思います。しかし、これまでのところ、すべてのクエリオプションがAccountActionsに適用されているため、私は壁にぶつかりました。

TransactionTypesの返されたリストのURLにクエリオプションを適用する方法はありますか?言い換えれば、SelectManyのURLから、TransactionTypesに関連するAccountActionsを取得して、見つけたTransactionTypesにクエリオプションを適用する方法がありますか?

以下は、私が使用しているコードの抜粋です。以下の図に見られるように

[Route(FullControllerPath + "/TransactionTypes")] 
public IHttpActionResult GetTransactionTypes(ODataQueryOptions<AccountAction> queryOptions, bool addCols, int? skip, int? take) 
{ 
    using (AccountActionManagement _accountActionManage = new AccountActionManagement(this.GenerateInformation())) 
    { 
     _accountActionManage.SetTraslationList("DATASTRUCT-CONFIG-ACCOUNTACTIONTRANSACTIONTYPE", language); 

     // Query composition 
     IQueryable<TransactionType> query = queryOptions.ApplyTo(_accountActionManage.GetTypeAsQueryable<AccountAction>()) 
                 .OfType<AccountAction>() 
                 .SelectMany(aa => aa.TransactionTypes) 
                 .Include(tt => tt.AccountActionForDefaultTransactionType.DefaultTransactionType); 

     var queryData = query.Select(tt => new 
         { 
          Id = tt.Id, 
          Name = tt.Name, 
          Operation = tt.Operation, 
          Type = tt.Type, 
          Default = tt.AccountActionForDefaultTransactionType != null && 
             tt.AccountActionForDefaultTransactionType.DefaultTransactionType.Id == tt.Id, 
          Version = tt.AccountActionForDefaultTransactionType.Version 
         }); 
     // Get count 
     int totalRows = queryData.Count(); 

     // Get biggest version in query 
     var maxVersion = queryData.Max(i => i.Version); 

     // Get data from database 
     var queryResult = queryOptions.OrderBy == null 
           ? queryData.OrderBy(i => i.Id) 
             .Skip(skip ?? 0) 
             .Take(take ?? totalRows) 
             .ToList() 
           : queryData.Skip(skip ?? 0) 
             .Take(take ?? totalRows) 
             .ToList(); 
...}} 

、AccountActionはTransactionTypeに多対多の関係を有しています。 AccountActionには最初の役割があり、TransactionTypeには2番目の役割があります。

AccountActionTransactionTypeDiagram

+0

ダイアグラムでは、AccountActionとTransactionTypesの関係が多対多ではなく、一対多であることが示されています。どちらが正しい? – Cameron

+0

AccountActionとTransactionTypesは単なるタグに過ぎません。 AccountActionが単数で、TransactionTypesが複数であるという事実は、関係の性質を示すものではありません。むしろ、アスタリスクは関係の多重度を示す。 –

+0

私は彼らが誤解を招くのを見て、エンティティの横にあるタグを画像から削除しました。 –

答えて

0

私はこの問題の回避策を見つけました。 ApplyToメソッドに正しいタイプを渡していないことに気付きました。ここでは、IQueryableにというクエリオプションを適用する代わりに、IQueryableにクエリオプションを適用します。AccountActionのクエリオプションを適用するのではなく、のクエリオプションをTransactionTypeに適用します。

以下は、上記の変更を加えたコードです。また、変更したディフチェッカーはhereです。

[Route(FullControllerPath + "/TransactionTypes")] 
public IHttpActionResult GetTransactionTypes(ODataQueryOptions<AccountAction> queryOptions, bool addCols, int? skip, int? take) 
{ 
    using (AccountActionManagement _accountActionManage = new AccountActionManagement(this.GenerateInformation())) 
    { 
     _accountActionManage.SetTraslationList("DATASTRUCT-CONFIG-ACCOUNTACTIONTRANSACTIONTYPE", language); 

     // Query composition 
     IQueryable<TransactionType> query = queryOptions.ApplyTo(_accountActionManage.GetTypeAsQueryable<AccountAction() 
           .SelectMany(aa => aa.TransactionTypes) 
           .Include(aa =>  aa.AccountActionForDefaultTransactionType.DefaultTransactionType)) 
           .OfType<TransactionType>(); 


     var queryData = query.Select(tt => new 
         { 
          Id = tt.Id, 
          Name = tt.Name, 
          Operation = tt.Operation, 
          Type = tt.Type, 
          Default = tt.AccountActionForDefaultTransactionType != null && 
             tt.AccountActionForDefaultTransactionType.DefaultTransactionType.Id == tt.Id, 
          Version = tt.AccountActionForDefaultTransactionType.Version 
         }); 
     // Get count 
     int totalRows = queryData.Count(); 

     // Get biggest version in query 
     var maxVersion = queryData.Max(i => i.Version); 

     // Get data from database 
     var queryResult = queryOptions.OrderBy == null 
           ? queryData.OrderBy(i => i.Id) 
             .Skip(skip ?? 0) 
             .Take(take ?? totalRows) 
             .ToList() 
           : queryData.Skip(skip ?? 0) 
             .Take(take ?? totalRows) 
             .ToList(); 
...}} 
関連する問題