2012-03-30 21 views
12

Poniżej znajduje się przykład kodu C#, którego nie mogę skompilować podczas wykonywania linq join. Czy ktoś wie, dlaczego to się nie kompiluje?Nie można pobrać kwerendy C# linq do kompilacji z łączeniami

Błąd jest

typu argumenty nie można wywieść z kwerendy

(W moim prawdziwym kodzie Fetch() zwraca 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); 
     } 
    } 
} 

Odpowiedz

31

Ten dołączyć to w niewłaściwy sposób runda:

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

Powinno być:

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

Zakres zmienna przedstawisz zawsze musi być po stronie prawo strony equals. Zwykle kompilator całkiem dobrze mówi ci, że w komunikacie o błędzie, pamiętaj ...

+0

Dziękuję bardzo za szybką odpowiedź. nie uwierzysz, ile czasu zmarnowałem na to. Byłoby miło, gdyby kompilator był nieco bardziej pomocny, ale twoja wskazówka na temat "wprowadzonej zmiennej odległości zawsze musi znajdować się po prawej stronie równych", to jest to, co teraz zobowiążę się do pamięci. –