带有特定where/order by子句的通用Linq
我想创建一个通用方法,允许我使用Linq to Sitecore(.Net 4.5)搜索Sitecore 7索引 这将用于各种搜索,例如:带有特定where/order by子句的通用Linq,linq,generics,sitecore,sitecore7,Linq,Generics,Sitecore,Sitecore7,我想创建一个通用方法,允许我使用Linq to Sitecore(.Net 4.5)搜索Sitecore 7索引 这将用于各种搜索,例如: 获取前5个最新新闻页面 获取最后20个事件页面 通用网站搜索 等等等等等等 我可以创建一个非常通用的搜索方法,它适用于所有类型的页面。它为Where子句提供了一个通用模板谓词,该谓词适用于所有类型的搜索 但是,对于上面的搜索,我还需要为Where子句添加特定的谓词,并为Order By等添加特定的表达式。目的是为每种类型的搜索创建子类,从而实现这些细节
- 获取前5个最新新闻页面
- 获取最后20个事件页面
- 通用网站搜索
- 等等等等等等
如何创建一个通用方法,该方法具有针对每种搜索类型的特定功能?我找到了一个解决方法 而不是:
Expression<Func<NewsPageBase, bool>> datePredicate = PredicateBuilder.False<NewsPageBase>();
datePredicate = datePredicate.And(newsPage => newsPage.ArticleDate < DateTime.Now);
如果您的基类是从Sitecore类“SearchResultItem”中派生出来的子类,那么这将起作用。按如下方式修改代码可以满足您的需要
public virtual ReadOnlyCollection<T> Search<T>() where T : Base, new()
{
List<T> results = new List<T>();
using (IProviderSearchContext context = ContentSearchManager.GetIndex("sitecore_web_index").CreateSearchContext())
{
Expression<Func<T, bool>> outerPredicate = PredicateBuilder.True<T>();
// Create a predicate for a news page search.
Expression<Func<NewsPageBase, bool>> datePredicate = PredicateBuilder.True<NewsPageBase>();
datePredicate = datePredicate.And(newsPage => newsPage.ArticleDate < DateTime.Now);
//outerPredicate = outerPredicate.And((Expression<Func<T,bool>>)(object)datePredicate);
outerPredicate = outerPredicate.And((Expression<Func<T, bool>>)(object)datePredicate);
// 2. IQueryable<T> searchQuery = context.GetQueryable<T>().Where(outerPredicate).OrderByDescending(newsPage => newsPage.ArticleDate).Take(5);
IQueryable<T> searchQuery = context.GetQueryable<T>().Where(outerPredicate);
results = searchQuery.ToList();
}
return new ReadOnlyCollection<T>(results);
}
公共虚拟只读集合搜索(),其中T:Base,new()
{
列表结果=新列表();
使用(IProviderSearchContext=ContentSearchManager.GetIndex(“sitecore\u web\u index”).CreateSearchContext())
{
表达式outerPredicate=PredicateBuilder.True();
//为新闻页面搜索创建谓词。
表达式datePredicate=PredicateBuilder.True();
datePredicate=datePredicate.And(newsPage=>newsPage.ArticleDate表达式
,但将其强制转换为对象
首先会解决此问题,编译器会对此进行投诉Expression<Func<T, bool>> innerPredicate = PredicateBuilder.False<T>();
innerPredicate = innerPredicate.Or(item => ((DateTime)item[(ObjectIndexerKey)"article_date"] < DateTime.Now));
searchQuery = searchQuery.OrderByDescending(item => item[(ObjectIndexerKey)"article_date"]);
public virtual ReadOnlyCollection<T> Search<T>() where T : Base, new()
{
List<T> results = new List<T>();
using (IProviderSearchContext context = ContentSearchManager.GetIndex("sitecore_web_index").CreateSearchContext())
{
Expression<Func<T, bool>> outerPredicate = PredicateBuilder.True<T>();
// Create a predicate for a news page search.
Expression<Func<NewsPageBase, bool>> datePredicate = PredicateBuilder.True<NewsPageBase>();
datePredicate = datePredicate.And(newsPage => newsPage.ArticleDate < DateTime.Now);
//outerPredicate = outerPredicate.And((Expression<Func<T,bool>>)(object)datePredicate);
outerPredicate = outerPredicate.And((Expression<Func<T, bool>>)(object)datePredicate);
// 2. IQueryable<T> searchQuery = context.GetQueryable<T>().Where(outerPredicate).OrderByDescending(newsPage => newsPage.ArticleDate).Take(5);
IQueryable<T> searchQuery = context.GetQueryable<T>().Where(outerPredicate);
results = searchQuery.ToList();
}
return new ReadOnlyCollection<T>(results);
}