【问题标题】:Need help figuring out what this C# code does需要帮助弄清楚这个 C# 代码的作用
【发布时间】:2013-11-21 23:46:47
【问题描述】:

我正在阅读 asp.net 和 C# 的教程,作者使用了一些我试图理解的代码。我知道它的作用,但我只是想确定一下。

 public IQueryable<Category> GetCategories()
    {
        var db = new WingtipToys.Models.ProductContext();
        IQueryable<Category> query = db.Categories;
        return query;
    }

我有点困惑

 IQueryable<Category>

还有线

IQueryable<Category> query = db.Categories;

我认为它是一个名为 GetCategories() 的方法,它只接受 Category 对象。该方法定义了一个新的实例产品上下文,然后它运行某种类型的查询并返回它。我可能很近,也可能很远。我只是想确定一下。

【问题讨论】:

  • 也许这条 SQL 语句将帮助您了解那里返回的内容:“从产品中选择类别” - 结果是表产品中的类别列表。 LINQ to SQL 允许您使用 linq api 在 c# 中编写查询,并将其转换为 SQL。 :)
  • 这段代码泄露了一个数据库连接,在垃圾收集器处理它之前不会关闭。
  • @Jake 我怀疑你被通用语法抛出了。 IQueryable&lt;Category&gt;IQueryable 接口的一个实例,专门用于处理Category 对象,就像List&lt;Category&gt; 是一个只处理Category 对象的List

标签: c# asp.net


【解决方案1】:

所以我认为您遇到问题的部分是方法签名中的通用返回类型,如果您以前没有遇到过它可能是一种奇怪的语法。

您的方法返回IQueryable&lt;Category&gt; 的类型,因此您将返回一个实现接口IQueryable&lt;T&gt; 的对象,特别是一个专门用于与Category 对象配合使用的对象。

如果你想创建一个字符串列表,你可以这样做:

MyStrings = new List<string>();

如果你想创建一个返回字符串列表的方法:

public List<string> FetchMyStrings(); // List<string> is your return type.

在您的情况下,您将返回 Category 对象的列表:

public List<Category> FetchMyCategories(); // List<Category> is your return type.

对于IQueryable&lt;T&gt; 的一些极好的解释,以及为什么你会对它感兴趣,我会推荐这里的答案: What is the difference between IQueryable<T> and IEnumerable<T>?

其余的代码似乎初始化了一个新的数据库连接,并返回一个可查询的对象,允许您获取类别以在代码的其他地方使用。

【讨论】:

  • 第二段你的信息有点不对,IQueryableIQueryable&lt;T&gt;有很大区别。
  • IQueryable vs IQueryable&lt;T&gt; 没什么大不了的,因为IQueryable&lt;T&gt; 实现了IQueryable。然而,我确实知道这是一个大问题的框架中的一种情况是IListIList&lt;T&gt;。如果你去看看IList&lt;T&gt; 实现IList,所以你不能像可以互换的那样使用它们。
  • 我明白了,谢谢你的提示;这正是我在这里提出问题的原因=D
【解决方案2】:

IQueryable 返回类型用于指示您希望 C# 传递您在 GetCategories() 方法上使用的任何过滤器,以直接传递到数据库。即使该方法设置为传回所有类别,您也可以将它们限制在更高的级别。这使您不必为每个您能想到的返回数据库的过滤器创建多个方法。

这是StackOverflow Example about the differences between IEnumerable and IQueryable的链接

【讨论】:

    【解决方案3】:

    ...称为 GetCategories() 的方法仅接受类别对象...

    IQueryable&lt;Category&gt; 是一个类似于intstring 的类型,因此该方法不接受任何内容,它以可查询的方式返回类别 (IQueryable)。

    【讨论】:

      猜你喜欢
      • 2020-09-03
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多