如何初始化LINQ联接结果的空变量

本文关键字:结果 变量 初始化 LINQ | 更新日期: 2023-09-27 18:22:34

我有一个LINQ查询,在执行之前,我需要在剃刀页面的顶部初始化它的变量。正如您所看到的,变量q的初始化范围与稍后使用的范围不同。

if(state)
{
var q = 
   from table1 in connection.Get<DbTable1> ...
   join table2 in connection.Get<DbTable2> ...
   ...;
 }
 ...lines...
 ...lines...
 if(state)
 {
     foreach(var item in q)
     {
     ...
     }
 }

那么,我如何在代码顶部声明varq来扩大它的范围并覆盖整个代码呢?简而言之,我如何定义&在第一个if.

如何初始化LINQ联接结果的空变量

之前初始化q

通常没有解决方案,尤其是在投影匿名类型时。我能想到的唯一可能的解决方法是使用Lazy<T>和类似的编译器类型推断功能。

首先,一个小助手方法

static Lazy<T> Lazy<T>(Func<T> factory) { return new Lazy<T>(factory, true); }

然后

var q = Lazy(() =>
    from table1 in connection.Get<DbTable1> ...
    join table2 in connection.Get<DbTable2> ...
    ...);
if (state)
{
}
...lines...
...lines...
if (state)
{
    foreach(var item in q.Value)
    {
        ...
    }
}

不需要声明查询返回的类型。您可以在foreach中使用var关键字。

foreach(var item in q)
{
    // ...
}

当编译代码时,qitem的类型都将从代码中推断出来,而不必显式地声明它们。

然而,如果您仍然想明确地声明它们,您必须执行以下操作:

IEnumerable<ClassName> = from table1 in connection.Get<DbTable1>
                         join table2 in connection.Get<DbTable2>
                         on table1.A equals table2.A
                         select new ClassName
                         {
                             // Set the values for your properties here
                         };

其中ClassName是一个类,表示要从这些表的联接中选择的对象类型。