2013-12-04 3 views
0

У меня есть массив ключевых слов: splitKeywords = { "KeywordA", "KeywordB", "KeywordC"}Альтернативная реализация для Foreach с использованием выражения Linq

И сущность KeywordSearch:

public class KeywordSearch 
{ 
    // Primary properties 
    public int Id { get; set; } 
    public string Name { get; set; } 

    // Navigation properties 
    public Keyword Keyword { get; set; } 
} 

Где Ключевое слово является:

public class Keyword 
{ 
    // Primary properties 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<KeywordSearch> KeywordSearches { get; set; } 
} 

Как я могу построить массив KeywordIds на основе всех macthing KeywordSearch-х?

У меня это очень uggly код:

var keywordSearchQuery = _keywordSearchRepository.Query; 

List<int> keywordIds = new List<int>(); 

foreach (var keyword in splitKeywords) 
{ 
    var keywordsFound = keywordSearchQuery.Where(kws => kws.Name == keyword).Select(kws => kws.Keyword.Id); 

    if (keywordsFound.Count() == 0) 
    { 
     keywordIds.Clear(); 
     return null; 
    } 
    else 
    { 
     keywordIds.AddRange(keywordsFound); 
    } 
} 

Я имел этот один, но он возвращает любые совпадающие ключевые слова:

keywordIds = keywordSearchQuery.Where(ks => splitKeywords.Contains(ks.Name)).Select(ks => ks.Keyword.Id); 

EDIT:

Пример:

KeywordSearch = { 1, "KEYWORDA", { 1, "KeywordA" }}, 
       { 2, "KEYWORDB", { 2, "KeywordB" }}, 
       { 3, "KEYWORDC", {3, "KeywordC" }} 

If I search for "KEYWORDA", I get KeywordId = 1 
If I search for "KEYWORDA KEYWORDB", I get KeywordId = 1,2 
If I search for "KEYWORDA KEYWORDX", I get NULL 
+0

Как определить 'keywordSearchQuery'? – paqogomez

+0

Привет, спасибо. Он определен как «var keywordSearchQuery = _keywordSearchRepository.Query;» – Patrick

+1

Что такое тип 'keywordSearchQuery'? –

ответ

1

Что вы идете в том числе объединение двух коллекций.

В любое время, когда вы находите все предметы из одной коллекции, которые обрабатывают текущий элемент цикла foreach, вы должны заглянуть в соединение, так как это, вероятно, то, что вы делаете.

объединение не только намного чище, но намного более эффективным:

var query = from keywordSearch _keywordSearchRepository.Query 
    join keyword in splitKeywords 
    on keywordSearch.Name equals keyword 
    select keywordSearch.Keyword.Id; 

return query; //add a ToList here if it's important to materialize the query now 
+0

Привет, спасибо за вашу помощь, но он возвращает ключевые слова, которые содержат ЛЮБОЙ, а не ВСЕ, что это то, чего я пытаюсь достичь. Если я не нахожу ключевые слова, соответствующие всем ключевым словам, я должен вернуть NULL – Patrick

+0

@Patrick Ну, это то, что ваш код делал раньше ... – Servy

+0

Можете ли вы проверить мой код, если keywordsFound.Count() == 0 это означает, что ключевое слово не было найдено, я возвращаю NULL – Patrick

0

Вот способ сделать это; он работает с LINQ to Objects, я не уверен, как он будет работать при запросе через EF.

var keywordIds = from keyword in _keywordRepository 
where splitKeywords.Intersect(keyword.KeywordSearches.Select(kws => kws.Name)) 
        .Count() == splitKeywords.Count 
select keyword.Id; 

Обратите внимание, что этот запрос основан на _keywordRepository вместо _keywordSearchRepository. Я думал, что имеет смысл структурировать запрос таким образом.

+0

Привет, спасибо за вашу помощь. Чтобы быть более конкретным, каждое ключевое слово может иметь один или несколько ключевых слов, связанных с ним, например, для ключевого слова «Автомобиль», ключевого слова «CAR» и «CARS», а если я понимаю, что вы говорите, все ключевые слова находятся в таблице KeywordSearch только для одного ключевого слова, и здесь это не так. – Patrick

+0

@Patrick Я думаю, что я правильно понимаю отношения «один ко многим». Посмотрите мои тестовые данные и посмотрите, как они запускаются на http://ideone.com/slyWKr –

+0

Привет, у меня есть чек, но вы предполагаете, что все keywordSearches связаны с ключевым словом, чтобы вернуть это ключевое слово, но здесь это не так. Каждое ключевое слово, как «KeywordA», «KeywordB», «KeywordC» имеет собственное ключевое слово «поиск» KEYWORDA, «KEYWORDB», «KEYWORDC», поэтому, если я буду искать «KEYWORDA KEYWORDC», у меня будет 2 ключевых слова, но если я буду искать «KEYWORDA KEYWORDX ", я ничего не получаю, потому что у меня нет ключевых слов, которые, по словам KeywordSearch, соответствуют всем этим. – Patrick

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