【问题标题】:Linq-to-entities to normal linqLinq-to-entities 到普通 linq
【发布时间】:2023-04-06 16:11:01
【问题描述】:

我有这行 linq

_cache = _repository.EntitiesNoTracking().Select(k => Crypto.DecryptString(k.KeyValue)).ToHashSet();

这当然行不通,因为 Linq-to-entities 不知道 Crypto.DecryptString。 所以解决方案可能是

_cache = _repository.EntitiesNoTracking().ToArray().Select(k => Crypto.DecryptString(k.KeyValue)).ToHashSet();

但是,这似乎有一个多余的ToArray()。 我认为下一个代码会更有效:

var _cache = new HashSet<string>();
foreach(var item in _repository.EntitiesNoTracking()){
    _cache.Add(Crypto.DecryptString(item.KeyValue));
}

是否有某种方法可以告诉 Linq-to-entities 转换为普通的 linq,而无需额外的步骤?

【问题讨论】:

  • 如果你喜欢,请使用ToEnumerable

标签: c# linq linq-to-entities


【解决方案1】:

您不需要EntitiesNoTracking(),因为您有自定义投影。此外,检索到的数据应该受到额外的Select 的限制。

_cache = _repository.
   .Select(k => k.KeyValue)
   .AsEnumerable()
   .Select(s => Crypto.DecryptString(s))
   .ToHashSet();

【讨论】:

  • 谢谢!我认为您应该始终在只读查询上使用EntitiesNoTracking(),以防止 EF 产生复杂的跟踪开销。 see the Microsoft docs “当结果用于只读场景时,没有跟踪查询是有用的。它们执行得更快,因为不需要设置更改跟踪信息。”
  • 我知道AsNoTracking()。无论如何,如果您只从数据库返回字符串,要跟踪什么?答案很简单——什么都没有。 EF 将仅跟踪 FULL 实体。
  • 好的,太好了。但是添加不跟踪是 / 坏 / 吗?有什么可失去的?
  • 还不错,但它什么都不做,而且查询翻译速度有点慢。
  • “有点减速查询翻译”这似乎与 MS 在文档中所说的相反。你对此有一些参考吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
相关资源
最近更新 更多