我正在尝试执行Select
方法的反向:根据Id
投射大量项目,
我在考虑Where
所以我会做这样的事情:
db.Books.Where(b => b.Id==1 || b.Id==3 || b.Id==5)
但如果我有很长的Id列表,或者我想通过Title
进行搜索,那将是非常痛苦的代码,
那么有没有办法根据一组值检索项目列表(如SQL:WHERE id IN..
)
答案 0 :(得分:8)
string[] bookNames = { "BookName1", "BookName2" };
db.Books.Where(b => bookNames.Contains(b.Name));
答案 1 :(得分: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;
}
}
}
答案 2 :(得分:0)
您可以声明List<integer>
或整数数组。为其添加值。和USE Contains
方法
Where(b => lst.Contains(b))
答案 3 :(得分: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
安装包Mshwf.NiceLinq