2012-03-30 14 views
12

A continuación se muestra un ejemplo reducido de algún código de C# que no puedo compilar mientras realizo algunas combinaciones de linq. ¿Alguien sabe por qué esto no compila?No se puede obtener la consulta de C# linq para compilar con las uniones

El error se

argumentos de tipo no se pueden deducir de la consulta

(En mi código real Fetch() devuelve un IQueryable<T>)

using System.Collections.Generic; 
using System.Linq; 

namespace LinqJoin 
{ 
    public class DataRepository<T> 
    { 
     public IList<T> Fetch() 
     { 
      return new List<T>(); 
     } 
    } 

    internal class SSOUser 
    { 
     public int Id { get; set; } 
    } 

    internal class UserRole 
    { 
     public int SSOUserId { get; set; } 
     public int RoleId { get; set; } 
    } 

    internal class Role 
    { 
     public int RoleId { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var users = new DataRepository<SSOUser>().Fetch(); 
      var userroles = new DataRepository<UserRole>().Fetch(); 
      var roles = new DataRepository<Role>().Fetch(); 

      var result = from u in users 
        join ur in userroles on u.Id equals ur.SSOUserId 
        join r in roles on r.RoleId equals ur.RoleId 
        select u; 

     //var x1 = users.Join(userroles, u => u.Id, ur => ur.SSOUserId, (u, ur) => new { User = u, UserRole = ur}).Join(roles, x => x.UserRole.RoleId, r => r.RoleId, res => res.User); 
     } 
    } 
} 

Respuesta

31

Esta unión es el camino equivocado redondo:

join r in roles on r.RoleId equals ur.RoleId 

que debe ser:

join r in roles on ur.RoleId equals r.RoleId 

La variable de rango se introduce siempre tiene que estar en el lado derecho del equals. Normalmente, el compilador es bastante bueno para decirte que en el mensaje de error, ten en cuenta ...

+0

Muchas gracias por la respuesta rápida. no creerás cuánto tiempo he desperdiciado en eso. Sería bueno si el compilador fuera un poco más útil, pero tu consejo sobre "la variable de rango que introduces siempre tiene que estar en el lado derecho de los iguales" es uno que ahora comprometeré con la memoria. –

Cuestiones relacionadas