2017-11-02 4 views
0

私はentity framework coreを使用しています。EFとLINQを使用したユーザーによるトランザクションのグループ化

カラム:(から送信された)User1Id

カラム:User2Id(に送ら)

カラム:Amount

カラム:CreatedAt

私は transactionsテーブル構造下記た( .net core 2.0

ここでは、送信者または受信者のいずれかが現在のユーザーであり、トランザクションを送受信したユーザー別にグループ化されたすべてのトランザクションを選択したいと思います。

出力の例は、(3ように、現在のユーザーIDを考慮)のようになります。

[ 
    { 
    "user" = "ID 1 here" 
    "transactions" : [ 
      { 
       "User1Id" : "ID of user 3 is either here", 
       "User2Id" : "or here", 
       "Amount" : 100, 
       "CreatedAt" : 10.01.2017 
      },{ 
       "User1Id" : "ID of user 3 is either here", 
       "User2Id" : "or here", 
       "Amount" : 200, 
       "CreatedAt" : 09.01.2017 
      } 
     ] 
    },{ 
    "user" = "ID 2 here" 
    "transactions" : [ 
      { 
       "User1Id" : "ID of user 3 is either here", 
       "User2Id" : "or here", 
       "Amount" : 100, 
       "CreatedAt" : 01.01.2017 
      } 
     ] 
    } 
] 

これは、LINQのために複雑すぎるクエリのように見える...しかし、ここで私が出ている最も近い結果があります: - :

が警告:Microsoft.EntityFrameworkCore.Query [2すべての

var userId = User.GetUserId(); // current user ID 
var result = _context.Transactions 
    .AsNoTracking() 
    .Where(t => t.User1Id == userId || t.User2Id == userId) 
    .Select(u => new 
    { 
     Transaction = u, 
     User = (u.User1Id == userId) ? u.User1Id : u.User2Id 
    }) 
    .GroupBy(g => g.User) 
    .Select(u => new 
    { 
     User = u.Key, 
     Transaction = u.ToList() 
    }); 

まずこのLINQは警告を生成しますLINQ式 'GroupBy(IIF(([t] .User1Id == __userId_2)、[t] .User1Id、[t] .User2Id)、new <> f__AnonymousType2`2(トランザクション= [t]、ユーザー= IIF(([t] .User1Id == __userId_2)、[t] .User1Id、[t] .User2Id))))は翻訳できず、ローカルで評価されます。

第2に、現在のところ、トランザクションの順序付けは考慮されておらず、ユーザーあたりのトランザクション数は制限されません。

最後に、u.Key.ToList()は、以前のグループの値を持っていて、それをリストに変換するだけなので、一部のデータ(ユーザーIDなど)が重複しています。

このシナリオのカスタムSQLを作成することを検討しています。適切なLINQソリューションはありますか?

答えて

0

これはコメントになりましたが、擬似コードでは分かりにくいでしょう。時にはKISS(それを簡単に保つ...)が最善の方法です。もちろん、これは純粋に意見です。型の式「System.Func`2 [Transactions.DAL.Models.Transaction、可能System.String]」:これは例外 `System.ArgumentExceptionのをスロー

Transactions.Where(t => t.User1Id == userId).Select(t => new { user = t.User2Id, transaction = t}) 
    .Union(Transactions.Where(t => t.User2Id == userId).Select(t => new { user = t.User1Id, transaction = t })) 
    .OrderBy(x => x.transaction.CreatedAt) 
    .Take(15) 
    .ToList() 
    .GroupBy(x => x.user); 
+0

:私にとっては、私はこのような何かをすることになりますメソッド 'System.Collections.Generic.IEnumerable'1 [System.Linq.IGrouping'2 [System.String、..]の型' System.Func'2 [System.Object、System.String] 'のパラメータに使用できません[]。]] _GroupBy [Object、String、<> f__AnonymousType2'2](System.Collections.Generic.IEnumerable'1 [System.Object]、System.Func'2 [System.Object、System.String]、 'パラメータ名:arg1' – Alex

+0

私はちょうど 'エンティティ・フレームワーク・コア(entitybyframe core)」を含む。本当?たぶん私は 'Dapper'に固執すべきです.. – Alex

+0

私はおそらく推定されていたが、私はその声明をテストしなかったと述べるべきだった。 ToList()を追加するように編集しました。 – Tebc

関連する問題