5

これが私が高いものから低いものへとソートしたい値のいくつかの例です。

8,929 viewers
18,213 viewers
2,223 viewers
41,231 viewers

そして、これが私が使用しているクエリの例です:

streams = streamRepository.FindAll()
                          .OrderByDescending(s => s.ViewCount)
                          .Take(4);

これは、パラメーターをintではなく文字列として受け取っていると想像しているため、正しく機能していませんが、それは驚くべきことではありません。

クリーンなC#/ Linqコードを使用してこの「順序付け」を作成することをどのように提案しますか?

理想的には、上記のデータ例を使用すると、結果の順序集合は次のようになります。

41,231 viewers
18,213 viewers
8,929 viewers
2,223 viewers
4

3 に答える 3

1

フォーマットが常に同じである場合、私はこれを試してみます:

streams = streamRepository.FindAll()
    .AsEnumerable()
    .OrderByDescending(s => 
        int.Parse(s.ViewCount.Substring(0, s.ViewCount.IndexOf(' ') - 1))
    .Take(4);
于 2012-04-15T15:16:46.293 に答える
1

たぶん、最もきちんとした解決策ではありません。しかし、おそらく次のようなものです:

streamRepository.FindAll()
        .OrderByDescending(t => t =>Convert.ToDouble(
                 t.ViewCount.Substring(0,t.ViewCount.IndexOf(' '))))

生成された sql。それほど恐ろしくなく、linqpadで動作します:

-- Region Parameters
DECLARE @p0 Int = 0
DECLARE @p1 NChar(1) = ' '
-- EndRegion
SELECT [t0].[SomeText]
FROM [Table1] AS [t0]
ORDER BY CONVERT(Float,SUBSTRING([t0].[SomeText], @p0 + 1, 
    (CASE 
        WHEN (DATALENGTH(@p1) / 2) = 0 THEN 0
        ELSE CHARINDEX(@p1, [t0].[SomeText]) - 1
     END))) DESC

linq はSQL 関数にsubstring変換できるためです。indexofしかし、これはフォーマットに固有のものでもあります。あなたの質問へのコメントのように、列を列に分割することもお勧めします。

于 2012-04-15T15:32:53.753 に答える
0

のようなもの(より疑似、何もテストしていませんが、近いはずです)...

streams = streamRepository.FindAll()
                          .Select(s=> new { Original = s, Count = ParseToInt(s.ViewCount)})
                          .OrderByDescending(a => a.Count)
                          .Take(3);

...ParseToIntその文字列をカウントするだけの単純な解析です(「 」で分割し、最初の解析を int に取るだけです)

これがいくつかの助けになることを願っています

編集:これは、なしで機能します-Dbシナリオ

Db バインド クエリの場合 - マップされている (そして linq から SQL にマップできる) SQL 関数を使用して、「文字列」を int に解析する必要がありますが、何が最適かすぐにはわかりません。その方法。また、すべてのデータを取得できるように選択する必要があります。
その場合、通常、(文字列の代わりに) Db に int フィールドを保持するのがおそらく最善です。

于 2012-04-15T15:13:26.160 に答える