私は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ソリューションはありますか?
:私にとっては、私はこのような何かをすることになりますメソッド '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
私はちょうど 'エンティティ・フレームワーク・コア(entitybyframe core)」を含む。本当?たぶん私は 'Dapper'に固執すべきです.. – Alex
私はおそらく推定されていたが、私はその声明をテストしなかったと述べるべきだった。 ToList()を追加するように編集しました。 – Tebc