我试图与Select方法相反:为了基于它们的Id构建一堆项目,我想到了Where,所以我会做这样的事情:
db.Books.Where(b => b.Id==1 || b.Id==3 || b.Id==5)但是,如果我有一个长长的Id列表,或者如果我想通过Title进行搜索,这将是非常痛苦的代码,那么是否有一种方法可以根据一组值(如SQL:WHERE id IN..)检索一个项列表?
发布于 2016-12-10 21:28:56
我编写了一个扩展方法,它对任何类型和任何成员都非常有用:
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
安装包Mshwf.NiceLinq
发布于 2016-12-06 23:01:47
string[] bookNames = { "BookName1", "BookName2" };
db.Books.Where(b => bookNames.Contains(b.Name));发布于 2016-12-06 23:20:40
上面列出的解决方案-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;
}
}
}https://stackoverflow.com/questions/41006488
复制相似问题