【问题标题】:How to declare a global variable to be used on a C# expression如何声明要在 C# 表达式上使用的全局变量
【发布时间】:2013-11-08 22:25:42
【问题描述】:

我正在这样做:

protected void btn_Click(object sender, EventArgs e){

var myQuery = from tab1 in Table
              where myConditions
              select tab1 ;

之后,我将使用用户选择的选项进行过滤:

myQuery.Where(x => x.someField == someChoice);

它工作正常。但我想用全局范围声明“myQuery”。

我应该怎么做?我试图将下面的行放在类内和方法外,但我不知道应该使用什么类型:

private someTypeThatIdontKnow myQuery;

TIA。

【问题讨论】:

  • 编译本地定义并询问调试器类型是什么。最终应该是接口IEnumerable<Something> 的一些实现,其中Somethingtab1 获取的类型。
  • 这取决于Table的类型。
  • 我正在尝试这样做,以进行后续过滤: myQuery = myQuery.Where(x => x.someField == someChoice);并以这种方式声明: private IQueryable myQuery;但我收到错误消息:“myQuery”与 myNameSpace.myEntity.myQuery 的声明冲突。

标签: c# global-variables scope declaration


【解决方案1】:

偷偷摸摸的方法是做到这一点:

this.myQuery = ...

然后将插入符号放在myQuery(会有红色波浪线,表示有问题),然后按ctrl+.,然后选择IDE 的报价生成一个字段:

这会生成一个正确类型的字段:

现在只需在设置MyTable 之后将查询本身移动到您需要它的任何位置(可能是构造函数)。

【讨论】:

  • 优雅的一个...我喜欢这个答案.. :)
【解决方案2】:

如果您将鼠标悬停在 var 关键字上,它会告诉您它是什么类型。

然后您可以使用它为类定义一个成员来保存结果。

【讨论】:

    【解决方案3】:

    您可以使用var关键字获取类型,然后声明该类型的变量。

    或者,如果出于某种原因您不想这样做,您可以使用 dynamic 类型,但我建议不要这样做。

    最好的解决方案是让编译器使用 var 关键字推断类型,然后将该类型显式用作类成员(您所指的“全局变量”)。

    【讨论】:

      【解决方案4】:

      使用IQueryable<TableEntity>,其中TableEntityTable DbSet 中对象的类型。

      也可能是IEnumerable<TableEntity>,具体取决于您是针对数据库还是内存中的集合运行查询。

      您还可以通过将鼠标悬停在myQuery 上来查看要使用的类型。

      【讨论】:

      • 事实上,“myQuery”比我提出的问题要复杂得多。我在 10 个表之间进行连接。那么,在这种情况下,如果我使用很多表,应该使用什么 TableEntity?
      • 它应该是您在select 子句中使用的任何类型。如果你使用匿名类型,你有两个选择:要么使用命名类型而不是匿名类型,要么使用dynamic。使用 dynamic 不是类型安全的。
      【解决方案5】:

      LINQ 查询返回某种 IEnumerable,所以我相信它会是

      private IEnumerable<TypeOfObjectInYourCollection> myQuery;
      

      【讨论】:

      • 不一定。它可能需要改为IQueryable
      【解决方案6】:

      类型将为tab1 类型的IQueryable

      假设您最终调用ToList() 来运行查询,您最终会得到List&lt;tab1&gt;。因此,您可以将全局变量声明为该类型。

      我假设tab1 是一个可供您获取列表的对象。

      List<tab1> result = new List<tab1>();
      
      protected void btn_Click(object sender, EventArgs e)
      {
          var myQuery = from tab1 in Table
                        where myConditions
                        select tab1;
      
          myQuery.Where(x => x.someField == someChoice);
      
          result = myQuery.ToList();
      }
      

      【讨论】:

      • 您不需要执行 ToList - IQueryable 是 IEnumerable 的子级。
      • 执行 ToList 将在该点强制执行,与迭代集合相同。这是另一个话题,但由于它涉及全局变量,因此最好将变量设为派生较少的类型(IEnumerable),并将执行延迟到需要时。
      【解决方案7】:

      试试EnumerableRowCollection:

       private EnumerableRowCollection query
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-30
        • 1970-01-01
        • 1970-01-01
        • 2020-02-10
        • 1970-01-01
        • 2012-03-30
        相关资源
        最近更新 更多