在Where方法中应用搜索模式?

时间:2016-12-06 22:59:23

标签: c# linq

我正在尝试执行Select方法的反向:根据Id投射大量项目, 我在考虑Where所以我会做这样的事情:

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

但如果我有很长的Id列表,或者我想通过Title进行搜索,那将是非常痛苦的代码, 那么有没有办法根据一组值检索项目列表(如SQL:WHERE id IN..

4 个答案:

答案 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