【问题标题】:LINQ - 'The type of one of the expressions in the join clause is incorrect. Type inference failed in the call to 'GroupJoin'.'LINQ - '连接子句中的表达式之一的类型不正确。对“GroupJoin”的调用中的类型推断失败。
【发布时间】:2012-04-25 14:41:12
【问题描述】:

我有这个关于组加入的查询:

    foreach (var item in someList)
    {
                    var result = (from t1 in someContext.Table1
                                  join t2 in someContext.Table2 on new { t1.SomeID, item.SomeName} equals new {t2.SomeID, t2.SomeName} into j1 
                                  ...
    }

我想知道是否可以像上面那样加入群组?

new { t1.SomeID, item.SomeName} equals new {t2.SomeID, t2.SomeName}

item.SomeName 来自我正在迭代的列表。

如果不是,我将如何更改语句以获得所需的结果?

【问题讨论】:

标签: c# .net linq


【解决方案1】:

与 equals 表达式一起使用的属性类型必须匹配。所以例如Table1.SomeIDInt32Table2.SomeIDNullable<Int32>,那么它们不匹配。

编辑

foreach (var item in someList)
    {
       var someName = item.SomeName;
       var result = (from t1 in someContext.Table1
                     join t2 in someContext.Table2 on 
                               new { t1.SomeID, SomeName = someName} 
                        equals new { t2.SomeID, t2.SomeName} into j1 
                                  ...
    }

还要检查 item.SomeName 与 t2.SomeName 的类型相同

【讨论】:

  • 虽然它们确实匹配,但是当我将item.SomeName 更改为t1.SomeName 时,它会编译...那么这不是问题吗?无法加入查询范围之外的字段?
  • 如果一个连接键是 Nullable 而另一个不是但具有相同的数据类型,我们不能通过一些转换或类似的东西来连接它们吗?
  • @Jain,我认为调用 .GetValueOrDefault(..) 会解决您的问题
【解决方案2】:

在这种情况下,您必须确保两个新匿名对象的属性和类型相同。我通常会给出属性的具体名称。

例如:

 var result = from t1 in someContext.Table1
              join t2 in someContext.Table2 on 
                          new { SomeID = t1.SomeID, SomeName = someName} equals 
                          new { SomeID = t2.SomeID, SomeName = t2.SomeName} into j1 

【讨论】:

  • 为加入键提供相同的名称就可以了。很奇怪,虽然类型匹配。
  • 似乎不仅顺序和类型必须匹配,而且被比较的字段/属性的名称也必须匹配。如果您正在比较,例如new {x.aid, x.zid} 等于 new {y.aid, y.id} 那么你只需要命名 zid 或 id 来匹配另一个,一切都会编译。例如:new {x.aid, x.zid} 等于 new {y.aid, zid = y.id}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 2021-09-19
相关资源
最近更新 更多