无法编译带有联接的C# LINQ查询

12

以下是一段削减版的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);
        }
    }
}
1个回答

32

这个连接的方向是错误的:

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

应该是这样的:

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

你引入的范围变量总是要在 equals 的右侧。当然,通常编译器会在错误信息中提示你...


非常感谢您的快速回答。您无法想象我在这上面浪费了多少时间。如果编译器能够更有帮助就好了,但是您关于“引入的范围变量必须始终位于等号的右侧”的提示是我现在将牢记在心的。 - chrisp_68

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接