如何初始化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.
通常没有解决方案,尤其是在投影匿名类型时。我能想到的唯一可能的解决方法是使用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)
{
// ...
}
当编译代码时,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
是一个类,表示要从这些表的联接中选择的对象类型。