2017-11-17 29 views
0

私はCouchbase v4.5および.NET SDKバージョン2.3.8を使用しています。私は、ビューをN1QLクエリに移行する途中です。ビューに利用可能なJavascirptを使用すると、ドキュメントの配列メンバーをソートし、続いて配列からただ1つの要素を選択する柔軟性が得られました。だから、私の見解では、私が持っていたのに対し:特定の配列要素の選択

'Username': doc.Document.LogActions.sort(function(a,b){ return (a.Time > b.Time) })[doc.Document.LogActions.length - 1].Username 

を...私は今N1QLクエリで、.NET SDKを経由して同じことを達成するために苦労しています。注意点は、これをLINQだけでやろうとしていることです。私は完全なN1QLサポートを提供する生の文字列クエリを使用することができますが、チームリーダーはこれがLINQ経由で行われることを望んでいます... LINQ経由で絶対に行う方法がない限り。

私は次のことを試してみた:をソート

-

Username = doc.Document.LogActions 
         .OrderByDescending(logAction => logAction.Time) 
         .FirstOrDefault() 
         .Username, 

配列内のオブジェクトのプロパティでソートすることが許可されていませんちょうど最終を取る - 最後

をサポートしていません
Username = transaction.Document.LogActions 
           .LastOrDefault() 
           .Username, 

並べ替えなし - Stil私は配列を返します

私が考えることができるもう一つの事は、配列を.NETに戻してそこにフィルタリングすることです。しかし、平均してアレイに含まれるアイテム数の基準はありません。むしろ、必要のないデータを取り戻すことは避けたいと考えています。

生の文字列クエリを使用するにはどうすればよいですか?理想的には、Timeプロパティに基づいて、配列から最新の「ログアクション」を検索しようとしています。

答えて

1

私はこれでいくつかのより多くの周りを演奏し、このような何かが動作するはずのように思えるながら:

Username = transaction.Document.LogActions 
           .OrderByDescending(logAction => logAction.Time) 
           .Select(g => g.Username) 
           .ToArray()[0], 

...ああ、それはしません。 「N1Ql配列サブクエリが配列要素のみで1つの順序付けをサポートする」というエラーが表示されます。だから私は笑い--for GroupByを使用してみました - とLOが、私は戻って結果を得るか見よ:

Username = transaction.Document.LogActions 
           .OrderByDescending(logAction => logAction.Time) 
           .GroupBy(logAction => new { logAction.Time, logAction.Username }) 
           .Select(g => g.Key.Username) 
           .ToArray()[0], 

これは私が戻って正しい結果を得ることを確認して私の葉 - CBの順序は思わので、 bit woolky - しかし、それは少なくとも半加工です。

0

私はLINQの専門家ではありません。しかし、以下はN1QLクエリです。

MAX、MIN引数は配列を許可します。配列の0番目の要素はフィールドの集約が必要な要素、1番目の要素は必要な要素です。この手法を使用すると、以下のようにMIN/MAXの非集約フィールドを投影できます。

INSERT INTO default VALUES ("k01",{ "logActions":[ { "User":"u1", "Time":"2017-11-52T14:35:00Z" }, { "User":"u2", "Time":"2017-11-09T14:35:00Z" }, { "User":"u3", "Time":"2017-11-03T14:35:00Z" }, { "User":"u4", "Time":"2017-11-02T14:35:00Z" }, ] }); 
SELECT MAX([u.Time,u.User])[1] AS User FROM default d USE KEYS "k01" UNNEST d.logActions AS a; 

もこのhttps://developer.couchbase.com/documentation/server/current/n1ql/n1ql-language-reference/subqueries.htmlを達成することができるN1QLサブクエリの式を使用して5.0.0にN1QL : Find latest status from an array

をチェックアウト。

関連する問題