Linq-to-entities 到正常的 linq

Linq-to-entities to normal linq

我有这行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,而无需额外的步骤?

您不需要 EntitiesNoTracking() 因为您有自定义投影。检索到的数据还应受到额外 Select.

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