如何为生成一系列匿名类型的linq查询声明全局变量

时间:2016-08-07 16:09:36

标签: c# linq variables anonymous-types declare

我有一个linq查询,它生成一系列匿名类型。查询定义为:

var query = from a in Db.Table1
    join b from Db.Table2
    join...
    ...
    select new {
     a.field1, a.field2, 
     b.field1, NewName = b.field2 };

现在我想在以下场景中使用此查询:

if (x == 1)
{ query = ...
  ...rest of code_1 }
if (x == 2)
{ query = ...
  ...rest of code_2 }

'查询'从第一个'如果'将使用不同的表,连接和where语句,而不是来自第二个'如果'但两者将具有完全相同的“选择新的'言。

为了做到这一点,我需要声明一个变量'查询'如果'内部可见。语句。

当我选中'键入'查询'使用:

query.GetType().ToString();
它给了我:

query type = 'System.Data.Objects.ObjectQuery`1[<>f__AnonymousType7`14[System.Int32,System.String,System.String,System.String,System.Nullable`1[System.DateTime],System.Decimal,System.Nullable`1[System.DateTime],System.Decimal,System.String,System.String,System.String,System.String,System.String,System.String]]'

我无法声明一个单独的类,因为我只能在我编写代码的方法中编写。 我应该如何声明一个&#39;查询&#39;变量?

2 个答案:

答案 0 :(得分:1)

我看到的唯一方法是使用示例来定义它:

var query = Enumerable.Repeat(new
{
    field1 = default(int),
    field2 = default(string),
    field3 = default(string),
    // other fields ...        
}, 0).AsQueryable();

其中field1field2等应该是具有实际类型的具体属性名称,按内部选择内部使用的确切顺序排列。

答案 1 :(得分:0)

作为此解决方案的延续,我想询问是否有可能使用动态&#39;其中&#39;声明。在搜索时,我被重定向几次到基于PredicateBuilder类的解决方案,但这需要一个方法语法而不是查询语法。我是否需要将我的查询转换为lambda,还是有另一种方法可以实现此目的?

我的额外&#39;其中&#39; (因为我已经有一些&#39; where&#39;条件)语句应该类似于:

where
( a.field1 = a[0] and b.field1 = b[0] ) ||
( a.field1 = a[1] and b.field2 = b[1] ) ||
( a.field1 = a[2] and b.field2 = b[2] ) ||
....
( a.field1 = a[a.Length] and b.field2 = b[b.Length] )