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);}
}
但我最终还是这样做了,以防我会避免一个问题,那就是让我整个上午都在追赶一只被上帝遗弃的虫子,最后面对一条死胡同,我会在墙上贴一张写着“我早就告诉过你了”的纸条