2012-03-30 20 views
12

Aşağıda bazı C# kodlarının aşağıya doğru bir örneği var. Bazı linq birleşimlerini yaparken derleyemiyorum. Bunun neden derlenmediğini bilen var mı?Katılımcılar ile derlemek için C# linq sorgusu alınamıyor

Tipi argümanlar sorgudan çıkarsanamayacağına

hata olduğunu

Bu katılmak

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); 
     } 
    } 
} 

cevap

31

yanlış bir yoldur (benim gerçek kodda Fetch() bir IQueryable<T> döndürür) yuvarlak:

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

Olmalıdır:

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

sen tanıtmak aralık değişken her zaman equals ait sağ tarafta olmak zorunda. Normalde derleyici, hata mesajında ​​bunu size bildirmek konusunda oldukça iyidir ...

+0

Hızlı cevap için çok teşekkürler. Bunun için ne kadar zaman harcadığımı bilmiyorsun. Derleyici biraz daha faydalı olsa da güzel olurdu, ancak "size sunduğunuz aralık değişkeni her zaman eşitliğin sağ tarafında olmalı" ile ilgili ipucunuz, şimdi belleğe bağlı olacağım. –