[英]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.