簡體   English   中英

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

[英]Apply search patterns in Where method?

我正在嘗試反向Select方法:根據他們的Id投射大量項目,我在考慮Where所以我會做這樣的事情:

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

但如果我有一長串Id,或者我想按Title搜索,那將是非常痛苦的代碼,所以有沒有辦法根據一組值檢索項目列表(如SQL: WHERE id IN..

string[] bookNames = { "BookName1", "BookName2" };

db.Books.Where(b => bookNames.Contains(b.Name));

上面列出的解決方案都有效--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;
    }
}
}

您可以聲明List<integer>或整數數組。 為其添加值。 AND USE Contains方法

Where(b => lst.Contains(b))

我寫了一個擴展方法,它可以隨心所欲地使用任何類型和任何成員:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM