2013-10-12 2 views
1

Я повторяю следующий код linq с немного другой секцией 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<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; 

ответ

3

(примечание: я не проверял этот код (занимает слишком много препарата), так что могут быть некоторые ошибки)

У вас есть два варианта.

Первый заключается в использовании того факта, что the Where extension method принимает Expression<Func<CMSUpdate, bool>> как предикат. Таким образом, вы просто должны создать свой собственный метод, который принимает Expression<Func<CMSUpdate, bool>> в качестве аргумента и использует этот аргумент для построения запроса:

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(); 
} 

и вызвать его с помощью предиката:

SummaryList(i => i.PublishDate.Year == year) 
SummaryList(i => i.Content.Contains(searchTerm)) 

(Вы, возможно, должны измените его, чтобы передать db в качестве аргумента).

Другой вариант использовать тот факт, что метод Where расширение возвращает IQueryable<CMSUpdate> и создать метод, который принимает этот IQueryable<CMSUpdate> от метода Where и применить остальную часть запроса к нему:

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

спасибо, совершенное объяснение, у меня есть сейчас, и +1 за предложение 2 способа :) –

+0

а код отлично работает в первый раз кстати –

Смежные вопросы