C# 将一个可计算的和可查询的链接安全吗?
我有一个扩展方法,可以对C# 将一个可计算的和可查询的链接安全吗?,c#,C#,我有一个扩展方法,可以对IEnumerable和IQueryable进行操作。该方法解析输入并最终调用Skip().Take() public static IEnumerable<T> SelectRange<T>( this IEnumerable<T> target, RangeHeaderValue range ) 这样做安全吗?我担心它会干扰IQueryable提供程序,而不是在内存集合上运行该方法。我理解懒惰/急切加载的基
IEnumerable
和IQueryable
进行操作。该方法解析输入并最终调用Skip().Take()
public static IEnumerable<T> SelectRange<T>(
this IEnumerable<T> target,
RangeHeaderValue range
)
这样做安全吗?我担心它会干扰IQueryable
提供程序,而不是在内存集合上运行该方法。我理解懒惰/急切加载的基本原理,但这是一个相当复杂的主题,我不想仅仅假设它会工作
注意:关于链接的危险性,公认的答案是正确的,但我想补充一点,实现
IQueryable
方法并从IEnumerable
one调用它(因此简单地切换事物)是安全的;这不是一个好主意
调用AsEnumerable()
将具体化整个查询,然后在客户端上运行Skip()
和Take()
您需要创建一个单独(且相同)的方法版本,该方法接受并返回只调用可查询方法的
IQueryable
,以便查询可以在服务器上运行。否;这不是一个好主意
调用AsEnumerable()
将具体化整个查询,然后在客户端上运行Skip()
和Take()
您需要创建一个单独(且完全相同)的方法版本,该方法接受并返回只调用可查询方法的
IQueryable
,以便查询可以在服务器上运行。简短回答:可能
AsEnumerable()
可能会实现您的查询。找出问题的最简单方法是并排获取和调试,以查看何时调用查询。实际上,IQueryable
继承自IEnumerable
此外,在调试时:如果您尝试查看发生了什么,IDE可能会将其具体化,以在nice VS floating GUI调试工具中显示它
根据我的经验:从AsEnumerable()
跳到AsQueryable()
不会具体化它,直到我调用ToArray()
,ToList()
或从ICollection
继承的任何其他对象,但请记住IQueryable
将计算保持在内存中,类似于图形。因此,即使您实际上没有看到它对数据库进行查询,在内存较低的级别上,您可能会看到一些性能成本
和您一样,我试图避免在我的存储库模式中生成DUP,特别是在分页时:
public static class Paginate
{
public static IEnumerable<T> Enumerable<T>(int records, int iPage, IEnumerable<T> input) where T : class { return input.Skip(records * iPage).Take(records); }
// My internal OCD hates this dup >.o
public static IQueryable <T> Queryable <T>(int records, int iPage, IQueryable <T> input) where T : class { return input.Skip(records * iPage).Take(records); }
}
公共静态类分页
{
公共静态IEnumerable可枚举(int记录,int-iPage,IEnumerable输入),其中T:class{return input.Skip(records*iPage).Take(records);}
//我的内部强迫症患者讨厌这个dup>.o
公共静态IQueryable查询(int记录,int iPage,IQueryable输入),其中T:class{return input.Skip(records*iPage).Take(records);}
}
但我最终还是这样做了,只是为了避免一个问题,让我整个上午都在追逐一只被上帝遗弃的虫子,最终走向一条死胡同,面对贴在墙上的一张写着“我早就告诉过你了”的便条。简短的回答:也许吧
AsEnumerable()
可能会实现您的查询。找出问题的最简单方法是并排获取和调试,以查看何时调用查询。实际上,IQueryable
继承自IEnumerable
此外,在调试时:如果您尝试查看发生了什么,IDE可能会将其具体化,以在nice VS floating GUI调试工具中显示它
根据我的经验:从AsEnumerable()
跳到AsQueryable()
不会具体化它,直到我调用ToArray()
,ToList()
或从ICollection
继承的任何其他对象,但请记住IQueryable
将计算保持在内存中,类似于图形。因此,即使您实际上没有看到它对数据库进行查询,在内存较低的级别上,您可能会看到一些性能成本
和您一样,我试图避免在我的存储库模式中生成DUP,特别是在分页时:
public static class Paginate
{
public static IEnumerable<T> Enumerable<T>(int records, int iPage, IEnumerable<T> input) where T : class { return input.Skip(records * iPage).Take(records); }
// My internal OCD hates this dup >.o
public static IQueryable <T> Queryable <T>(int records, int iPage, IQueryable <T> input) where T : class { return input.Skip(records * iPage).Take(records); }
}
公共静态类分页
{
公共静态IEnumerable可枚举(int记录,int-iPage,IEnumerable输入),其中T:class{return input.Skip(records*iPage).Take(records);}
//我的内部强迫症患者讨厌这个dup>.o
公共静态IQueryable查询(int记录,int iPage,IQueryable输入),其中T:class{return input.Skip(records*iPage).Take(records);}
}
但我最终还是这样做了,以防我会避免一个问题,那就是让我整个上午都在追赶一只被上帝遗弃的虫子,最后面对一条死胡同,我会在墙上贴一张写着“我早就告诉过你了”的纸条