繁体   English   中英

用Linq检查数据表中的值

[英]Check value in datatable with Linq

我正在创建词云,因此我使用Regex在Linq中拆分句子并将单词分组并进行计数。 但是,我不希望某些黑名单单词出现在我的云中,因此我将这些单词放入数据表(dtBlackList)中并使用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);

这个查询会严重影响我的表现吗? 这是检查数据表的正确方法吗?

像这样的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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM