2016-10-01 5 views
0

私はSizeNumbersで件のデータが、その後、私はそれらの番号のいずれかでこれを注文する場合は、このクラスのリストを持っている20*20*30 のようなものです、そのクラスどのようにLinq式で配列インデックスを使用できますか?

public class SizesClass 
    { 
     public int Sizeid { get; set; } 
     public string SizeNumbers { get; set; } 

    } 

を持っています。ヌルとexeptionに

var orderByDescending = Sizes.OrderBy(x => x.SizeNumbers.Split('*')[2]); 

しかしvar orderByDescendingターンは、この多分

The LINQ expression node type 'ArrayIndex' is not supported in LINQ to Entities. 
+1

コードを入力してください。 'サイズ'とは何ですか?分割後にSizeNumberの内容に3つ以上の要素が含まれないことがあります。それを確認する必要があります。 –

+0

'OrderBy'に' IComparer 'を提供し、それは期待どおりにフィルタリングします –

+0

OrderByはOrderingの列があなたが供給している値ではなく、独自のデフォルト比較アルゴリズム –

答えて

1

を言いましたか?

var orderByDescending = Sizes.AsEnumerable.OrderBy(x => x.SizeNumbers.Split('*')[2]); 

LINQはエンティティに「ArrayIndex」我々は()(またはToListメソッドを使用して)私たちはAsEnumerable()を使用していることを達成することができ、メモリにすべてのデータをロードする必要がサポートされていないので、我々は、すべてのオーダーを行うことができますインメモリコレクションに。

+1

を実行すると期待しているので上記のコードは機能しませんデフォルトでは 'Sizes'は' IEnumerable'ではありません –

+1

彼はそれについて言及しませんでしたが、何をしようとしているのかがLINQ to Entitesでサポートされていないため、何とかコレクションをmemoeryに持ってきてLINQをオブジェクトその上に。これは、AsEnumerable()またはToList()を明示的に呼び出すことで実現できます。 – YuvShap

+0

これは、失敗の原因ではありません。ここでは、OrderByによって期待される列の代わりに、値が指定されています。これは失敗の原因となります。 –

0

次のようにカスタムIComparer<SizesClass>を作成します。

public class SizesComparer : IComparer<SizesClass> 
{ 
    public int Compare(SizesClass first, SizesClass second) 
    { 
     if(first == null || second == null || first.SizeNumbers == null || second.SizeNumbers == null) 
      return 0; 

     var firstValue = first.SizeNumbers.Split('*')[2]; 
     var secondValue = second.SizeNumbers.Split('*')[2]; 

     return string.Compare(firstValue,secondValue); 
    } 
} 

次に実行します。の場合(昇順)

var result = Sizes.OrderBy(x => x, new SizesComparer()); 

を降順、Comparerコードを次のように変更します:

return string.Compare(secondValue,firstValue); 
上記のコード

警告

  • あなたは、文字列で*を持っているように、特定の前提に動作しますが、その後、あなたはそれを完全safeと例外
自由にするためにはComparerに関連するチェックをする必要があるインデックス2は、あります

は、あなたがあなただけのオリジナルのメカニズムを使用して注目している場合は、次のことを試して、それが失敗しないオリジナルな方法、 index value 2が存在しない場合でも、

var result = Sizes.OrderBy(x => x.SizeNumbers.Split('*').Select((y,i) => i == 2 ? y:null).Where(n => n != null).FirstOrDefault()); 
+1

解決方法* LINQ式ノードタイプ 'ArrayIndex'は** LINQ to Entities **。*例外でサポートされていませんか? –

+0

@IvanStoev、linqクエリ内でOPの配列が正しくないためにOPが取得されているというエラーがありましたが、この場合はIComparerを使用するために発生しません。なぜこれが機能しないのでしょうか?配列インデックスを使用する方法もありますが、それはエレガントな方法ではありません。 –

+0

また、元の方法でそれを行う編集を確認してください。 –

関連する問題