我有一个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。
答案 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)
{
// ...
}
如果您的代码将被编译,则q
和item
的类型将从您的代码中推断出来,而无需明确说明。
但是,如果您仍想明确声明它们,则必须执行以下操作:
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
是一个类,表示要从这些表的连接中选择的对象类型。