首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在哪里应用搜索模式?

在哪里应用搜索模式?
EN

Stack Overflow用户
提问于 2016-12-06 22:59:22
回答 4查看 113关注 0票数 3

我试图与Select方法相反:为了基于它们的Id构建一堆项目,我想到了Where,所以我会做这样的事情:

代码语言:javascript
复制
db.Books.Where(b => b.Id==1 || b.Id==3 || b.Id==5)

但是,如果我有一个长长的Id列表,或者如果我想通过Title进行搜索,这将是非常痛苦的代码,那么是否有一种方法可以根据一组值(如SQL:WHERE id IN..)检索一个项列表?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-12-10 21:28:56

我编写了一个扩展方法,它对任何类型和任何成员都非常有用:

代码语言:javascript
复制
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)));

你可以这样称呼它:

代码语言:javascript
复制
var myBooks = Books.In(b => b.Id, 1, 3, 5, 8, 11, 22);

为了我将来的需要,我把它上传到了NuGet

安装包Mshwf.NiceLinq

票数 0
EN

Stack Overflow用户

发布于 2016-12-06 23:01:47

代码语言:javascript
复制
string[] bookNames = { "BookName1", "BookName2" };

db.Books.Where(b => bookNames.Contains(b.Name));
票数 7
EN

Stack Overflow用户

发布于 2016-12-06 23:20:40

上面列出的解决方案-Dispersia的LINQ查询实际上很不错。

还有一个值得记住的可能性:您可以始终编写自己的LINQ类扩展方法。这是我为他们的价值而设的一对夫妇。(我并不是说这些解决方案实际上比其他解决方案更好,或者说你一定要使用它们-它们只是需要记住的东西,以备将来做类似的事情时参考)。

请注意,如果需要,编译器甚至允许您将它们添加到System.Linq命名空间中,但是您肯定会争论这是否是一个好做法。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41006488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档