如何为LINQ连接结果初始化空变量?

时间:2015-11-18 09:14:55

标签: c# linq scope

我有一个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)
     {
     ...
     }
 }

那么如何在代码顶部声明var q以扩大其范围并覆盖整个代码?简而言之,我如何定义&amp;在第一个if之前初始化q。

2 个答案:

答案 0 :(得分:1)

一般没有解决方案,特别是在投射匿名类型时。我能想到的唯一可能的解决方法是使用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)
    {
        ...
    }
}

答案 1 :(得分:0)

无需声明查询返回的类型。您只需在var中使用foreach关键字。

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是一个类,表示要从这些表的连接中选择的对象类型。