2012-04-13 37 views
7

tengo esta consulta ingenio unirse a un grupo:LINQ - 'El tipo de una de las expresiones en la cláusula join es incorrecto. La inferencia de tipo falló en la llamada a 'GroupJoin'. '

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 
            ... 
    } 

me gustaría saber si es posible tener un grupo unirse a que el anterior?

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

item.SomeName proviene de la lista que estoy iteración a través.

De lo contrario, ¿cómo cambiaría la declaración para obtener los resultados deseados?

+0

posible duplicado: http://stackoverflow.com/questions/3020442/linq-joining-in-c-sharp-with-multiple-conditions –

Respuesta

19

Los tipos de propiedades utilizadas con la expresión equals deben coincidir. Por ejemplo, Table1.SomeID es Int32 y Table2.SomeID es Nullable<Int32>, entonces no coinciden.

EDITAR

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 
            ... 
    } 

Compruebe también es item.SomeName mismo tipo que t2.SomeName

+0

Ellos coinciden sin embargo, pero cuando cambio el 'item.SomeName' a' t1.SomeName', se compila ... ¿Entonces ese no es el problema? ¿No se puede unir con un campo desde fuera del alcance de la consulta? – Willem

+0

Ver mi actualización por favor –

+3

'SomeName = someName' hizo el truco. Gracias. =) – Willem

10

En este caso, usted debe estar seguro de que las propiedades y el tipo de los dos nuevos objetos anónimos son los mismo. Normalmente doy un nombre específico de propiedades.

Ej .:

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 
+0

Dar el mismo nombre a las claves de unión hizo la escritura. Muy extraño, los tipos coinciden sin embargo. –

+1

Parece que no solo el orden y el tipo deben coincidir, sino que también debe compararse el nombre del campo/propiedad. Si está comparando, p. new {x.aid, x.zid} es igual a new {y.aid, y.id}, entonces solo necesitas el nombre zid o id para que coincida con el otro y todo se compilará. Por ejemplo: new {x.aid, x.zid} es igual a new {y.aid, zid = y.id} – JBC

Cuestiones relacionadas