gpt4 book ai didi

c# - 为什么这个linq扩展方法会两次命中数据库?

转载 作者:太空宇宙 更新时间:2023-11-03 20:41:57 26 4
gpt4 key购买 nike

我有一个名为 ToListIfNotNullOrEmpty() 的扩展方法,它两次访问数据库,而不是一次。第一次返回一个结果,第二次返回所有正确结果。

我很确定它第一次访问数据库是在调用 .Any() 方法时。

这是代码。

public static IList<T> ToListIfNotNullOrEmpty<T>(this IEnumerable<T> value)
{
if (value.IsNullOrEmpty())
{
return null;
}
if (value is IList<T>)
{
return (value as IList<T>);
}
return new List<T>(value);
}

public static bool IsNullOrEmpty<T>(this IEnumerable<T> value)
{
if (value != null)
{
return !value.Any();
}
return true;
}

我希望重构它,以便在调用 .Any() 方法之前,它实际上枚举整个列表。

如果我执行以下操作,则只进行一次数据库调用,因为列表已被枚举。

var pewPew = (from x in whatever
select x)
.ToList() // This enumerates.
.ToListIsNotNullOrEmpty(); // This checks the enumerated result.

我不太想调用 ToList() 然后调用我的扩展方法。伙计们,有什么想法吗?

最佳答案

我承认我看不出这种方法有什么意义。当然,如果您只是执行 ToList(),检查列表是否为空就足够了。当您期望一个列表时,可以说更难处理 null 结果,因为您总是必须在迭代它之前检查 null。

我认为:

 var query = (from ...).ToList();
if (query.Count == 0) {
...
}

相比,同样有效并且负担更轻
var query = (from ...).ToListIfNotNullOrEmpty();
if (query == null) {
...
}

而且您不必实现(和维护)任何代码。

关于c# - 为什么这个linq扩展方法会两次命中数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2257755/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com