var queueitem = context.CrawlerQueues.
Select(cq => new{cq.Guid,cq.Result}).
SingleOrDefault(cq => cq.Guid == guid);
Run Code Online (Sandbox Code Playgroud)
是一个坏主意,它会首先选择所有数据库行,然后找到一个或智能,并查看其中使用的上下文,只获取一行.
这样做的原因是我想只返回Guid和Result coloums.
return Newtonsoft.Json.JsonConvert.SerializeObject(queueitem, Formatting.Indented);
Run Code Online (Sandbox Code Playgroud)
如何在不监控网络流量或对数据库发出的请求的情况下找到答案?
dth*_*rpe 14
"它会首先选择所有数据库行,然后找到一个"
从技术上讲,不,.Select后跟.SingleOrDefault的组合不会那样做.Select()设置查询的参数,但它实际上不会获取任何数据.LINQ的延迟执行不会获取任何行,直到实际上必须产生数据结果.您可以一起编写多个查询(.Select(...).选择(..)等)并且在执行返回数据的操作(例如First()或.ToList())之前,实际上不会提取任何行.
但是,使用Single()可能会导致扫描整个数据集,以证明一个匹配的行是唯一匹配的行.
想想看:如何查询知道,一排是只有在匹配的数据集行?它必须尝试找到下一行.如果实际上只有一行匹配数据集中的数百万行,则Single()可能必须遍历所有这些数百万行,以证明当前匹配是唯一匹配.
如果您的数据集是SQL,并且您的数据以允许查询优化的方式编制索引,则Single()可能不会那么糟糕.但是,如果您的SQL数据没有以对此查询有帮助的方式编制索引,则Single()可能会为SQL服务器创建大量工作.
如果您的程序逻辑确实需要知道返回的行是整个数据集中唯一的行,则Single()是合适的.但是,还有其他方法可以保证唯一性.如果您可以在数据上设置与LINQ条件匹配的主键,那么只有一个匹配的行可以存在/可以添加到数据库中,因此您不需要Single().(具有讽刺意味的是,在这种情况下,Single()的性能也会非常快,因为主键索引可用于优化查询)
如果您只想要匹配条件的第一行,请使用First()而不是Single().First()只需要扫描数据行,直到找到第一个匹配项.它不必继续扫描行来证明第一个匹配是唯一匹配,如Single().