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

C# 将LINQ结果存储在全局变量中的最佳类型,c#,linq,linq-to-entities,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

我正在编写一个报告并加载数据,以便在使用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(),我还试图避免创建一个包含三个成员的类


有什么想法吗?

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


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

您的IQueryable结果采用不同的执行。如果您在“使用”块中对其进行编码,则在尝试访问结果(无论是否为全局变量)时,您都不会有连接


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

编辑老实说,我只是注意到您使用的是匿名类型。正如您现在已经知道的,在您的方法之外,您不可能获得anon类型。但是,您可以使用C#4.0元组

在当前方法之外传递/定义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
          };            
summaryData=来自_entity.summary中的摘要
//这里有一些限制
选择新元组
{
汇总表.付款类别说明,
汇总表.应付款金额,
汇总表.货币描述
};            

不管它是什么,如果它是一个收集/查询结果,
IEnumerable
将起作用

确保首先考虑是否需要使用
.ToList()
转换为列表(缓存结果)。
如果不这样做,原始枚举数将执行多次,这可能是一个(性能)问题。当枚举器访问一个不再打开、可访问的文件

时,您是否考虑创建一个包含三个变量的类,然后将结果存储在“全局”列表中?不真正理解您的POIT。LINQ的结果已经是枚举器,因此您可以枚举。@Tigran我想问题是他想稍后在事件中枚举,但他不能,因为他正在创建匿名类型,因此无法访问变量。这就是我对这个问题的看法。这正是Petak。我正是为了这个而努力避免上新课。你认为这是最好的方法吗?@allendehl如果你想在产生结果的范围之外的任何其他范围内使用结果,这将是唯一的方法。当然,可以使用反射(或.NET 4 dynamic)完成某些操作,但这需要比简单类所需的代码多得多的代码。基本上,我在报告“BeforePrint”事件中加载数据,然后我需要在详细的“BeforePrint”事件中使用数据,如果我正确的话,为了使用ToList(),我需要创建一个类来保存结果,这样我就可以声明列表类型的summaryData。我试图避免这种情况。除非这是我的最佳选择。使用
Tuple.Create(…)
会更容易,它将推断类型参数,因此您不必重复