2012-03-30 3 views
12

Ниже приведен вырезанный пример некоторого кода C#, который я не могу скомпилировать, выполняя некоторые объединения linq. Кто-нибудь знает, почему это не компилируется?Невозможно получить запрос C# linq для компиляции с помощью объединений

Ошибка

аргументы типа не может быть выведен из запроса

(В моем реальном коде Fetch() возвращает 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); 
     } 
    } 
} 

ответ

31

Это соединение является неправильным путем раунд:

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

Оно должно быть:

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

Переменная диапазона вы приведете всегда должен быть на правой стороне equals. Обычно компилятор очень хорошо говорит вам, что в сообщении об ошибке, заметьте ...

+0

Большое спасибо за быстрый ответ. вы не поверите, сколько времени я потратил на это. Было бы неплохо, если бы компилятор был немного полезнее, но ваш совет о «переменной диапазона, которую вы вводите всегда должен быть справа от равных», - это тот, который я теперь передам в память. –

Смежные вопросы