2015-12-18 3 views
0

Я создаю Word Cloud, и поэтому я разделяю свои предложения в Linq с помощью Regex и группируя слова и беря их. Тем не менее, я не хочу, некоторые черные списки слов, чтобы появиться в моем облаке, так что я получаю эти слова в DataTable (dtBlackList) и проверить с Linq, как показано в коде нижеПроверить значение в datatable с Linq

var result = (Regex.Split(StringsForWordCloud, @"\W+") 
        .GroupBy(s => s, StringComparer.InvariantCultureIgnoreCase) 
        .Where(q => q.Key.Trim() != "") 
        .Where(q => (dtBlackList.Select("blacklistword = '" + q.Key.Trim() + "'").Count() == 0)) 
        .OrderByDescending(g => g.Count()) 
        .Select(p => new { Word = p.Key, Count = p.Count() }) 
      ).Take(200); 

Будет ли этот запрос влияет на эффективность плохо? Правильно ли это проверять данные?

+1

Это неправильная область, где вы можете задать вопрос ** Является ли этот код хорошим или плохим **. Лучше добавьте свое сообщение здесь [Обзор кода стека Exchange] (http://codereview.stackexchange.com/). – Prabhat

+0

Что такое 'StringsForWordCloud'? Вы можете проверить профилировщик SQL, чтобы узнать, какие запросы генерируются при запуске вашего кода? – hatcyl

+0

StringsForWordCloud содержит предложения, из которых я хочу создать слово облако. Мой сервер не является сервером sql. – Hitesh

ответ

1

Запрос LINQ, поскольку этот будет выполнять запрос для каждого слова, найденного с помощью операции Regex.Split. Я имею в виду эту строку кода:

.Where(q => (dtBlackList.Select("blacklistword = '" + q.Key.Trim() + "'").Count() == 0)) 

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

В целом, выполнение запроса для проверки или завершения данных, извлеченных в вашей базе данных, не является хорошей практикой.

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

var words = Regex.Split(StringsForWordCloud, @"\W+") 
    .GroupBy(s => s, StringComparer.InvariantCultureIgnoreCase) 
    .Where(q => q.Key.Trim() != "") 
    .OrderByDescending(g => g.Count()) 
    .Select(p => new { Word = p.Key, Count = p.Count() }); 

// Now extract all the word in the blacklist 
IEnumerable<string> blackList = dtBlackList... 

// Now exclude them from the set of words all in once 
var result = words.Where(w => !blackList.Contains(w.Word) 
    .OrderByDescending(g => g.Count()) 
    .Take(200); 
Смежные вопросы