我試圖做Select
方法相反:根據項目一堆物品的Id
, 我想的Where
所以我會做這樣的事情:在Where方法中應用搜索模式?
db.Books.Where(b => b.Id==1 || b.Id==3 || b.Id==5)
但如果我有很長的ID列表,或者如果我想通過Title
進行搜索,它將是非常痛苦的代碼, 所以有沒有辦法根據一組值來檢索項目列表(如SQL:WHERE id IN..
)
我試圖做Select
方法相反:根據項目一堆物品的Id
, 我想的Where
所以我會做這樣的事情:在Where方法中應用搜索模式?
db.Books.Where(b => b.Id==1 || b.Id==3 || b.Id==5)
但如果我有很長的ID列表,或者如果我想通過Title
進行搜索,它將是非常痛苦的代碼, 所以有沒有辦法根據一組值來檢索項目列表(如SQL:WHERE id IN..
)
我」寫一個擴展方法,並且因爲我想它的偉大工程,與任何類型的任何成員:
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
這個linq看起來並不正確。這就是說,選擇「書籍」是其當前ID,1,3,5,8,11或22的所有書籍。如果ID是這些值中的一個,則不是。 – Dispersia
有區別嗎?這兩種方法選擇有這些Id的書,對吧?除了我的可讀性更強,更容易 –
如果仔細看過它,您會發現它們是相同的,但我使用泛型使其可重用 –
string[] bookNames = { "BookName1", "BookName2" };
db.Books.Where(b => bookNames.Contains(b.Name));
您可以聲明List<integer>
或整數數組。爲它添加值。和用途Contains
方法
Where(b => lst.Contains(b))
上述所有工作列出的解決方案 - 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;
}
}
}
創建ListBySearch(書)方法,通過其中包含圖書名稱的數組,並使用LINQ包含的SQL類似的方法。然後返回值。
public IEnumerable<Book> ListBySearch(string[] books)
{
return db.Books.Where(b => books.Contains(b.Name)).ToList();
}
答案是這樣的:'.Where(b => new [] {1,3,5,} .Contains(b.Id))' –