2012-03-30 12 views
12

Di seguito è riportato un esempio ridotto di un codice C# che non riesco a compilare durante l'esecuzione di alcuni join di linq. Qualcuno sa perché questo non viene compilato?Impossibile ottenere la query C# linq da compilare con join

L'errore è

tipo argomenti non possono essere dedotte dalla query

(Nel mio codice reale Fetch() restituisce 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); 
     } 
    } 
} 

risposta

31

Questa join è il modo sbagliato round:

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

dovrebbe essere:

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

La variabile di intervallo si introduce deve essere sempre sul lato destro del equals. Normalmente il compilatore è abbastanza bravo a dirti che nel messaggio di errore, attenzione ...

+0

Grazie mille per la risposta rapida. non crederai a quanto tempo ho sprecato per quello. Sarebbe bello se il compilatore fosse un po 'più utile, ma il tuo suggerimento su "La variabile di intervallo che introduci deve sempre essere sul lato destro degli uguali" è uno che ora assegnerò alla memoria. –