A continuación se muestra un ejemplo reducido de un código c # que no puedo compilar mientras hago algunas combinaciones de linq. ¿Alguien sabe por qué esto no se compila?

El error es

Los argumentos de tipo no se pueden inferir 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);
        }
    }
}
12
chrisp_68 30 mar. 2012 a las 18:43

1 respuesta

La mejor respuesta

Esta unión es al revés:

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

Debe ser:

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

La variable de rango que introduzca siempre debe estar en el lado derecho de equals. Normalmente, el compilador es bastante bueno para decirte que en el mensaje de error, fíjate ...

32
Jon Skeet 30 mar. 2012 a las 18:45
Muchas gracias por la rápida respuesta. no creerás cuánto tiempo he perdido en eso. Sería bueno si el compilador fuera un poco más útil, pero su consejo sobre "la variable de rango que introduce siempre tiene que estar en el lado derecho de los iguales" es algo que ahora guardaré en la memoria.
 – 
chrisp_68
30 mar. 2012 a las 19:05