我可以使用相同的Linq代码查询不同的条件吗?
每次我都用稍微不同的WHERE部分重复下面的linq代码 我希望遵循DRY原则,只指定一次视图模型。有没有办法重用同一查询并动态指定WHERE条件 我环顾了一下这里,遇到了一些类似的问题,但我找不到一个对我有意义的答案。我错过了什么明显的东西吗 第一个示例我可以使用相同的Linq代码查询不同的条件吗?,linq,where-clause,dry,Linq,Where Clause,Dry,每次我都用稍微不同的WHERE部分重复下面的linq代码 我希望遵循DRY原则,只指定一次视图模型。有没有办法重用同一查询并动态指定WHERE条件 我环顾了一下这里,遇到了一些类似的问题,但我找不到一个对我有意义的答案。我错过了什么明显的东西吗 第一个示例 List<CMSSummary> summaryList = db.CMSUpdates .Where(i => i.PublishDate.Year == year) // only this line is d
List<CMSSummary> summaryList = db.CMSUpdates
.Where(i => i.PublishDate.Year == year) // only this line is different
.AsEnumerable().Select(i => new CMSSummary
{
CMSObjectID = i.CMSObjectID,
Title = i.Title,
SubTitle = i.PublishDate.ToString("ddd dd MMM"),
ToolTip = i.Title,
Summary = i.Summary,
MainImage = i.MainImage,
ItemURL = i.URL,
FullURL = "/mockup/cmspage/" + i.URL,
HTMLClasses = ""
}).ToList();
return summaryList;
List summaryList=db.CMSUpdates
.Where(i=>i.PublishDate.Year==Year)//只有此行不同
.AsEnumerable().Select(i=>new CMSSummary
{
CMSObjectID=i.CMSObjectID,
Title=i.Title,
SubTitle=i.PublishDate.ToString(“ddd dd MMM”),
工具提示=i.标题,
总结=i.总结,
MainImage=i.MainImage,
ItemURL=i.URL,
FullURL=“/mockup/cmspage/”+i.URL,
HTMLClasses=“”
}).ToList();
返回汇总表;
第二个示例
List<CMSSummary> summaryList = db.CMSUpdates
.Where(i => i.Content.Contains(searchTerm)) // only this line is different
.AsEnumerable().Select(i => new CMSSummary
{
CMSObjectID = i.CMSObjectID,
Title = i.Title,
SubTitle = i.PublishDate.ToString("ddd dd MMM"),
ToolTip = i.Title,
Summary = i.Summary,
MainImage = i.MainImage,
ItemURL = i.URL,
FullURL = "/mockup/cmspage/" + i.URL,
HTMLClasses = ""
}).ToList();
return summaryList;
List summaryList=db.CMSUpdates
.Where(i=>i.Content.Contains(searchTerm))//只有此行不同
.AsEnumerable().Select(i=>new CMSSummary
{
CMSObjectID=i.CMSObjectID,
Title=i.Title,
SubTitle=i.PublishDate.ToString(“ddd dd MMM”),
工具提示=i.标题,
总结=i.总结,
MainImage=i.MainImage,
ItemURL=i.URL,
FullURL=“/mockup/cmspage/”+i.URL,
HTMLClasses=“”
}).ToList();
返回汇总表;
(注意:我没有测试这段代码(准备工作太多),所以可能会有一些错误)
你有两个选择
第一个是使用接受表达式
作为谓词的事实。因此,您只需创建自己的方法,该方法接受Expression
作为参数,并使用该参数构建查询:
List<CMSSummary> SummaryList(Expression<Func<CMSUpdate, bool>> predicate){
return db.CMSUpdates.Where(predicate)
.AsEnumerable().Select(i => new CMSSummary
{
CMSObjectID = i.CMSObjectID,
Title = i.Title,
SubTitle = i.PublishDate.ToString("ddd dd MMM"),
ToolTip = i.Title,
Summary = i.Summary,
MainImage = i.MainImage,
ItemURL = i.URL,
FullURL = "/mockup/cmspage/" + i.URL,
HTMLClasses = ""
}).ToList();
}
(您可能需要将其更改为作为参数传递db
)
另一个选项是使用Where
扩展方法返回IQueryable
,并创建一个从Where
方法获取该IQueryable
的方法,并对其应用查询的其余部分:
List<CMSSummary> ToSummaryList(IQueryable<CMSUpdate> query){
return query.AsEnumerable().Select(i => new CMSSummary
{
CMSObjectID = i.CMSObjectID,
Title = i.Title,
SubTitle = i.PublishDate.ToString("ddd dd MMM"),
ToolTip = i.Title,
Summary = i.Summary,
MainImage = i.MainImage,
ItemURL = i.URL,
FullURL = "/mockup/cmspage/" + i.URL,
HTMLClasses = ""
}).ToList();
}
谢谢你,完美的解释,我现在已经知道了,而且+1提供了两种方式:)
List<CMSSummary> ToSummaryList(IQueryable<CMSUpdate> query){
return query.AsEnumerable().Select(i => new CMSSummary
{
CMSObjectID = i.CMSObjectID,
Title = i.Title,
SubTitle = i.PublishDate.ToString("ddd dd MMM"),
ToolTip = i.Title,
Summary = i.Summary,
MainImage = i.MainImage,
ItemURL = i.URL,
FullURL = "/mockup/cmspage/" + i.URL,
HTMLClasses = ""
}).ToList();
}
ToSummaryList(db.CMSUpdates.Where(i => i.PublishDate.Year == year))
ToSummaryList(db.CMSUpdates.Where(i => i.Content.Contains(searchTerm)))