我可以使用相同的Linq代码查询不同的条件吗?

我可以使用相同的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

每次我都用稍微不同的WHERE部分重复下面的linq代码

我希望遵循DRY原则,只指定一次视图模型。有没有办法重用同一查询并动态指定WHERE条件

我环顾了一下这里,遇到了一些类似的问题,但我找不到一个对我有意义的答案。我错过了什么明显的东西吗

第一个示例

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)))