簡體   English   中英

將標准linq查詢轉換為通用以實現

[英]Convert a standard linq query to generic for implement

我在linq查詢中有以下代碼:

class Program
{
    static void Main(string[] args)
    {
        var allProfessionals = new Collection<Professional>
         {
             new Professional { Name = "Bruno Paulovich Silva" },
             new Professional { Name = "Ivan Silva Paulovich Bruno"},
             new Professional { Name = "Camila Campos"}
         };

        var namesSearch = new[] {"bruno", "silva"};

        var query = namesSearch.Aggregate(allProfessionals.AsQueryable(), (current, nome) => current.Where(oh => oh.Name.ToLower().Contains(nome.ToLower())));

        foreach (var res in query.ToList())
        {
            Console.WriteLine(res.Name.ToLower());
        }
    }
}

結果是:

Bruno Paulovich Silva
Silva Paulovich Bruno

我想知道如何將linq query Aggregate轉換為可以在其他時間重用的通用方法。

在下面的示例中,我將說明我對項目中使用的一般查詢的理解:

public IQueryable<T> QueryBy(Expression<Func<T, bool>> criteria)
{
    return DbSet.Where(criteria);
}

ps:對不起,我的英語不好

堅持最基本的要求和與腳本相同的輸出,就像這樣:

class Program
{
    static void Main(string[] args)
    {
        var allProfessionals =
            new Collection<Professional>
                {
                    new Professional {Name = "Bruno Paulovich Silva"},
                    new Professional {Name = "Ivan Silva Paulovich Bruno"},
                    new Professional {Name = "Camila Campos"}
                };

        var namesSearch = new[] {"bruno", "silva"};

        var items = allProfessionals
            .Select(x => x.Name)
            .ContainsAll(namesSearch);

        foreach (var res in items)
        {
            Console.WriteLine(res);
        }
    }
}

static class Extensions
{
    public static IEnumerable<string> ContainsAll(this IEnumerable<string> haystacks, IEnumerable<string> needles)
    {
        var lowerNeedles = needles.Select(x => x.ToLower()).ToList();
        var lowerHay = haystacks.Select(x => x.ToLower()).ToList();

        // note that Regex may be faster than .Contains with larger haystacks
        return lowerNeedles
            .Where(hay => lowerHay.All(hay.Contains)); // or .Any(), depending on your requirements
    }
}

請注意,如果您使用LinqToSQL或類似技術,則可能不使用表索引。 這可能會使查詢非常慢。

為了使其與上述QueryBy<T>相適應,它可能類似於:

        var items = allProfessionals.QueryBy(
            professional => namesSearch
                .Select(needle => needle.ToLower()) // convert all to lower case
                .All(hay => professional.Name.ToLower().Contains(hay))); // then try to search for a professional that matches all nameSearch.

這是我實現LikeBy方法的方法,其中字符串數組等效於包含所有內容。

public IQueryable<T> LikeBy(string[] strings, Func<IQueryable<T>, string, IQueryable<T>> criteria)
{
    return strings.Aggregate(GetAll(), criteria);
}

這里是如何實現的示例:

public IQueryable<ViaturaFuncao> FindByNome(string names)
{
    return Uow.Professional.LikeBy(names.Trim().Split(' '),
                                       (professional, nameProfessional) =>
                                       professional.Where(
                                           f => f.Name.ToLower().Contains(nameProfessional.ToLower())));
}

PS:在項目中,我們使用的是UnitOfWork,這就是為什么在實體之前放置UOW的原因

暫無
暫無

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

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