【问题标题】:How to declare global variable for linq query that produces a sequence of anonymous types如何为生成一系列匿名类型的 linq 查询声明全局变量
【发布时间】:2016-08-07 16:09:35
【问题描述】:

我有一个生成一系列匿名类型的 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 }

第一个“if”中的“查询”将使用与第二个“if”中的查询不同的表、连接和 where 语句,但是两者将具有完全相同的“select new”语句。

为此,我需要声明一个变量“查询”,该变量将在“if”语句中可见。

当我使用以下方法检查“查询”的“类型”时:

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]]'

我不能声明一个单独的类,因为我只能在我正在编写代码的方法中编写代码。 我应该如何声明一个“查询”变量?

【问题讨论】:

  • 您可以使用非泛型IQeuryabledynamic
  • 为自己制造麻烦似乎很麻烦。
  • 有了 IQueryable 我以后将无法使用,即 if (query.Count() > 0) - 对吗?

标签: c# linq variables anonymous-types declare


【解决方案1】:

我看到的唯一方法是使用 example 来定义它,如下所示:

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

其中field1field2 等应该是您的具体属性名称及其实际类型,与内部选择中使用的确切顺序相同。

【讨论】:

  • field1、field2 等只是“一些”字段。我并不是说 a.field1 的名称/属性与 b.field1 相同。但我明白你的意思……而且我知道。
  • 是的,对不起,这就是我的想法。但是我需要一个具体的名称/类型来制作一个匹配的例子。无论如何,我认为你已经明白了,我会从答案中删除那部分。
  • 我忘了提到您的解决方案对我来说非常有效!
【解决方案2】:

作为此解决方案的延续,我想询问使用动态“where”语句的可能性。在搜索此内容时,我多次重定向到基于 PredicateBuilder 类的解决方案,但这需要方法语法而不是查询语法。我需要将我的查询转换为 lambda 还是有其他方法可以完成此操作?

我的附加“where”(因为我已经有一些“where”条件)语句应该类似于:

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] )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 2020-05-16
    • 1970-01-01
    相关资源
    最近更新 更多