2012-03-30 27 views
12

Dưới đây là một ví dụ được cắt xuống của một số mã C# mà tôi không thể biên dịch khi thực hiện một số phép nối LINQ. Có ai biết tại sao điều này không biên dịch?Không thể nhận được truy vấn linq C# để biên dịch với các tham gia

Các lỗi được

Loại lập luận không thể được suy ra từ các truy vấn

(Trong mã thật của tôi Fetch() trả về một 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); 
     } 
    } 
} 

Trả lời

31

này tham gia là một cách sai lầm vòng:

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

Nó nên là:

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

Biến phạm vi bạn giới thiệu luôn luôn phải được trên đúng bên tay phải của equals. Thông thường trình biên dịch khá tốt về việc cho bạn biết rằng trong thông báo lỗi, hãy nhớ bạn ...

+0

Cảm ơn rất nhiều vì đã trả lời nhanh. bạn sẽ không tin bao nhiêu thời gian tôi đã lãng phí về điều đó. Nó sẽ được tốt đẹp nếu trình biên dịch là một chút hữu ích hơn nhưng tip của bạn về "phạm vi biến bạn giới thiệu luôn luôn phải được ở phía bên tay phải của bằng" là một trong tôi bây giờ sẽ cam kết vào bộ nhớ. –

Các vấn đề liên quan