2016-12-06 29 views
3

我試圖做Select方法相反:根據項目一堆物品的Id, 我想的Where所以我會做這樣的事情:在Where方法中應用搜索模式?

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

但如果我有很長的ID列表,或者如果我想通過Title進行搜索,它將是非常痛苦的代碼, 所以有沒有辦法根據一組值來檢索項目列表(如SQL:WHERE id IN..

+1

答案是這樣的:'.Where(b => new [] {1,3,5,} .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

Install-Package M shwf.NiceLinq

+0

這個linq看起來並不正確。這就是說,選擇「書籍」是其當前ID,1,3,5,8,11或22的所有書籍。如果ID是這些值中的一個,則不是。 – Dispersia

+0

有區別嗎?這兩種方法選擇有這些Id的書,對吧?除了我的可讀性更強,更容易 –

+0

如果仔細看過它,您會發現它們是相同的,但我使用泛型使其可重用 –

8
string[] bookNames = { "BookName1", "BookName2" }; 

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

您可以聲明List<integer>或整數數組。爲它添加值。和用途Contains方法

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

上述所有工作列出的解決方案 - Dispersia的LINQ查詢是非常好的實際。

還有一種可能性,記住它的價值:你總是可以編寫自己的類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(); 
}