2016-04-17 9 views
2

LINQスタイルの構文を使用するための非常に簡単な方法を実装しようとしています。例:カスタムLINQスタイルの実装

var res = ctx.Users.Where(x=>x.Name == "test" && x.Id > 1); 

Where()メソッドが実装しようとしているものです。

この考え方は、このWhere()メソッドでデータソース固有のクエリを実行して、潜在的に利用可能なインデックスを使用してデータのサブセットをすばやくフェッチすることです。チェーンされた後続のメソッドは、LINQ-to-Objectsを使用してメモリ内のIEnumerableに対して実行されます。

は、私は、これは次の実装を使用して仕事を得ることができます:私は気づい

public IEnumerable<T> Where(Expression<Func<T, bool>> predicate) 
{ 
    //work with predicate body and return result of query 
    return new List<T>(); 
} 

唯一の問題は、LINQの式のオブジェクトを構築する際に、パフォーマンスが少し遅いです。これは、非常に高速なローカル(非SQL)ストアで作業しているので重要です。私はカスタムの解析ロジックを使用できるように文字列(または他の形式)として生の入力を取得する方法はありますか?私はこれを文字列パラメータにすることができることを知っていますが、LINQラムダ構文を使用するタイプチェックが本当に好きです。

+5

文字列を解析するのは、式を処理する方が速いはずです。たぶんあなたのコードを投稿する価値があります –

+1

これは確かにX/Yの問題です...あなたは問題がXだと思っていますが、おそらくYです。あなたが望むものを投稿するのはなぜですか? –

答えて

0

質問に答えて、私は拡張メソッドがあなたが欲しいと思うと思います。この方法は次のようになります。

public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> source, Func<T, bool> predicate) 
    { 
     //process each item individually 
     List<T> returnValue = new List<T>(); 
     foreach (var t in source) 
     { 
      string stringToParse = t.ToString(); 

      //do things 
      string parsedString = stringToParse.ToUpper(); 

      //create your new object and add to the list that will be returned 
      returnValue.Add((T)Activator.CreateInstance(typeof(T), parsedString)); 
     } 

     return returnValue; 
    } 

これはパフォーマンスの向上をもたらさない可能性があります。また、この方法では、結果を1つずつ入力するのではなく、すべての計算を前に行います(yield機能を使用)。

public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> source, Func<T, bool> predicate) 
    { 
     //process each item individually 
     foreach (var t in source) 
     { 
      string stringToParse = t.ToString(); 

      //do things 
      string parsedString = stringToParse.ToUpper(); 

      //return your transformed object 
      yield return (T)Activator.CreateInstance(typeof(T), parsedString);     
     } 
    } 

クイック注:ただし、それは簡単に修正だ、あなたのメソッドのシグネチャはIEnumerable.Whereと同じようにしたいので、あなたは別のメソッド名を選択するとよいでしょう。

関連する問題