2012-04-04 3 views
2

У меня есть метод, который принимает массив строк в качестве параметра и запросов к свойству коллекции, который также представляет собой набор строк. Если это свойство имеет одно из значений внутри массива строк, переданное как параметр, оно должно быть возвращено.Запрос Linq в отношении свойства коллекции с параметром коллекции

Вот мой код:

public IEnumerable<BlogPost> GetAll(string[] tags, 
    bool includeUnapprovedEntries = false) { 

    foreach (var tag in tags) { 
     foreach (var blogPost in GetAll(includeUnapprovedEntries). 
      ToList().Where(x => x.Tags.Any(t => t == tag))) { 
      yield return blogPost; 
     } 
    } 
} 

Примечание:

Вот полный код:

https://github.com/tugberkugurlu/MvcBloggy/blob/master/src/MvcBloggy.Data/DataAccess/SqlServer/BlogPostRepository.cs

Это делает работу, но это только Безразлично» Кажется правильным. Я мог бы улучшить это с помощью некоторых методов расширения, но не мог понять, что будет делать трюк и сделать эту реализацию правильной.

Любая идея?

ответ

4

Как об этом:

public IEnumerable<BlogPost> GetAll(string[] tags, 
    bool includeUnapprovedEntries = false) { 

    return GetAll(includeUnapprovedEntries) 
     .Where(x => x.Tags.Any(t => tags.Contains(t)); 
} 

Вы можете вызвать ToList() материализовать результат. Обратите внимание, что это (надеюсь!) Приведет к запросу IN в SQL; если у вас большое количество тегов, я не удивлюсь, если это не удастся. (Я не знаю, как Entity Framework обрабатывает эту ситуацию.) Я считаю, что все должно быть хорошо с меньшим количеством тегов.

Отметьте, поддерживается ли это май зависит от версии используемой структуры сущности; Кажется, я помню, что некоторые преобразования, подобные этому (с использованием Contains в «локальной» коллекции) для перевода на IN в SQL) со временем улучшились. Удостоверьтесь, что вы развились против той же версии, которую вы будете развертывать против:

+1

А, мне так плохо сейчас. Думаю, я больше не должен писать код через 1 час. Благодаря! – tugberk

+0

@tugberk: Вы проверили, что это действительно работает * хотя? Не предполагайте, что это произойдет, пока вы не попробуете это :) Я достаточно хорошо предсказываю, как LINQ to Objects будет вести себя, но у меня очень мало опыта (по существу, ноль) с Entity Framework. –

+0

Кроме того, я должен упомянуть, что этот запрос действительно не подходит для SQL Server. Я создал коллекцию тегов по строке, разделенной точкой с запятой (как она есть здесь: https://github.com/tugberkugurlu/MvcBloggy/blob/master/src/MvcBloggy.Data/DataAccess/SqlServer/Model/BlogPost.cs). Таким образом, он получает все данные с помощью «GetAll» (да, это очень плохой подход, но я не мог понять другого) и делает запрос на это. Таким образом, в основном Linq является Objetcs. – tugberk

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