LINQ - 'join子句中某个表达式的类型不正确.调用"GroupJoin"时类型推断失败.

Wil*_*lem 10 .net c# linq

我有一个组连接的查询:

    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 
                                  ...
    }
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以按上述方式加入群组?

new { t1.SomeID, item.SomeName} equals new {t2.SomeID, t2.SomeName}
Run Code Online (Sandbox Code Playgroud)

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

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

Adr*_*ode 24

与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 
                                  ...
    }
Run Code Online (Sandbox Code Playgroud)

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

  • `SomeName = someName`做了伎俩.谢谢.=) (3认同)
  • @Jain,我认为调用 .GetValueOrDefault(..) 会解决你的问题 (2认同)

小智 12

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

例:

 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 
Run Code Online (Sandbox Code Playgroud)

  • 似乎不仅顺序和类型必须匹配,而且被比较的字段/属性的名称也必须匹配。如果您要比较例如新的{x.aid,x.zid}等于新的{y.aid,y.id},那么您只需要命名zid或id即可匹配其他内容,并且所有内容均可编译。例如:new {x.aid,x.zid}等于new {y.aid,zid = y.id} (2认同)