将LINQ结果存储在全局变量中的最佳类型

时间:2011-07-07 20:53:23

标签: c# linq linq-to-entities

我正在编写报告并在报告加载LINQ后立即加载数据。

summaryData = from summary in _entity.Summary
              // some constraints here
              select new
              {
                  summary.payment_category_desc,
                  summary.payment_due_amt,
                  summary.currency_desc
              };            

我需要稍后在不同的事件(PrintDetail)中使用这些结果,例如我可以这样说:

string name = summaryData[currentIndex].payment_category_desc

基本上我需要的是找到如何将LINQ结果存储在我以后可以枚举的全局变量中。我已经尝试了IQueriable,它不会让我。我也试图避免创建一个包含三个成员的类,以便能够使用ToList()。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

编辑说实话,我只是注意到您使用的是匿名类型。正如您现在所知道的那样,您无法在方法之外获得anon类型。但是,您可以使用C#4.0 Tuple<>

当您在当前方法之外传递/定义summaryData时,以下内容将起作用:

summaryData = from summary in _entity.Summary
          // some constraints here
          select new Tuple<string, DateTime, decimal>
          {
              summary.payment_category_desc,
              summary.payment_due_amt,
              summary.currency_desc
          };            

无论是什么,如果它是一个集合/查询结果,IEnumerable<T>将起作用

请务必先考虑是否需要使用.ToList()转换为列表(缓存结果)。 如果不这样做,原始枚举器将被多次执行,这可能是(性能)问题。考虑枚举器何时访问不再打开,可访问等的文件。

答案 1 :(得分:1)

就个人而言,我会避免使用全局变量。当您具有依赖项(如全局变量)时,您将更难以测试应用程序。

我不知道您的确切架构,但我很想将对象传递给需要它的相关方法。至少通过这种方式,您可以轻松地模拟对象并减少依赖性。

答案 2 :(得分:1)

您的IQueryable结果采用了自定义执行。如果您在“使用”块内编码,则在尝试访问结果时(无论是否为全局变量),您将没有连接。

尝试通过ToList()扩展方法从LINQ查询返回List。