2016-12-06 6 views
3

私はSelect方法の逆のやろうとしている:Whereメソッドで検索パターンを適用しますか?

db.Books.Where(b => b.Id==1 || b.Id==3 || b.Id==5) 

が、私の場合:私はこのようなものになるだろう、私はWhereと思ってい 、そのIdに基づいてアイテムの束を投影すると

+1

答え: '.Where(b => new {] {1,3}、} .Contains(b.Id))' –

答えて

0

私は、」拡張メソッドを書いた、と私は任意のタイプおよび任意のメンバーで、望んでいたとして、それは素晴らしい作品:

public static IEnumerable<TSource> In<TSource, TMember>(this IEnumerable<TSource> source, 
    Func<TSource, TMember> identifier, params TMember[] values) => 
source.Where(m => values.Contains(identifier(m))); 

あなたはこのようにそれを呼び出すことができます。

var myBooks = Books.In(b => b.Id, 1, 3, 5, 8, 11, 22); 

私の将来のニーズに合わせて、NuGetにアップロードしました

インストールパッケージM shwf.NiceLinq

+0

linqは本当に正しく見えません。これは、「書籍」が現在のid、1、3、5、8、11、または22のすべての本を選択することを意味します。idがそれらの値のいずれかでない場合。 – Dispersia

+0

違いがありますか? 2つのアプローチは、これらのIdを持っている本を選択します。私を除いてもっと読みやすくて簡単に –

+0

慎重に見ると、ジェネリックを使用して再利用可能にする以外は同じものが表示されます –

8
:Idの長いリストを持っている、または私は Titleで検索したい場合は、それは非常に苦痛コードになり、 ので( WHERE id IN.. SQLのような)値のグループに基づいて項目のリストを取得する方法があります
string[] bookNames = { "BookName1", "BookName2" }; 

db.Books.Where(b => bookNames.Contains(b.Name)); 
0

List<integer>または整数の配列を宣言できます。値を追加します。 DispersiaのLINQクエリは実際には本当にうれしいです - とContains方法すべての仕事の上に記載されている

Where(b => lst.Contains(b)) 
2

ソリューションを使用しています。

さらに価値のあることに留意してください。独自のLINQのような拡張メソッドを書くことができます。ここで私は彼らが価値があるもののためにまとめたカップルです。 (私は、これらが実際に他のソリューションよりも優れていると主張していませんし、代わりにそれらを使用したいと思っているわけでもありません - これからも同様のことをしたい場合に参考にしてください) 。

コンパイラでは、必要に応じてSystem.Linq名前空間に追加することもできますが、それが良い方法であるかどうかは間違いありません。

namespace System.Linq 
{ 
public static class LinqExtensions 
{ 
    // This one's more or less like "Contains" except for the "params" part 
    // Example: book.Id.In(1, 2, 3, 4, 5) 
    public static bool In<T>(this T item, params T[] list) 
    { 
     foreach (T args in list) 
     { 
      if (args.Equals(item)) 
      { 
       return true; 
      } 
     } 

     return false; 
    } 

    // Same idea as above except using an equality tester 
    // Example: listBooks.Where(book => book.In((bk, id) => bk.Id == id, 1, 2, 3, 4, 5)); 
    public static bool In<T, U>(this T item, Func<T, U, bool> equalitytester, params U[] list) 
    { 
     foreach (U arg in list) 
     { 
      if (equalitytester(item, arg)) 
      { 
       return true; 
      } 
     } 

     return false; 
    } 

    // See if any item in the first list is also in the second list 
    public static bool In<T, U>(this IEnumerable<T> list, Func<T, U, bool> equalityTester, params U[] argList) 
    { 
     foreach (T item in list) 
     { 
      foreach (U arg in argList) 
      { 
       if (equalityTester(item, arg)) 
       { 
        return true; 
       } 
      } 
     } 

     return false; 
    } 
} 
} 
0

ListBySearch(図書)メソッドを作成し、書籍名が含まれており、使用LINQは、SQLと同様の方法を含む配列を渡します。値を返します。

public IEnumerable<Book> ListBySearch(string[] books) 
{ 
    return db.Books.Where(b => books.Contains(b.Name)).ToList(); 
} 
関連する問題