通过导航属性LINQToEntities获取数据的Lambda表达式

时间:2011-09-28 16:15:35

标签: c# linq lambda

由于我刚刚开始使用LINQToEntities,Entity Framework和Lambda Expressions,因此我在获取某些数据方面遇到了问题。

让我解释一下我的情况:

我有一个包含4个表的数据库,如下所示:

Database diagram

当我在Visual Studio(2010)中从数据库生成模型时,结果如下:

Model in Visual Studio

我搜索了一些信息,结果发现由于表t_user_role只有两个父表中的id,所以它在模型中被抽象化,你必须使用导航属性。

我在给定系统上获取用户的角色信息时遇到了一些问题(如下一个功能那样)

    public t_role GetRoleForUser(string userId, string sysId)
    {
        entities = new secfinEntities(); //context from the model

        t_role userRole = entities.t_role.Where(r => r.t_user.Any(u => u.uid == userId) & r.sys_id == sysId).First();

        return userRole;
    }

现在我必须实现一个简单的搜索功能,它将查看包含所提供字符串的用户,并在给定系统上返回用户的id和名称(uid,user_name)及其角色的信息(role_id,role_name)(系统信息)我有事先),所以基本上我想将下一个SQL查询转换为Lambda表达式(请记住,在模型中表t_user_role已被抽象)

SELECT U.uid, U.user_name, R.role_id, R.role_name
FROM t_user U
    INNER JOIN t_user_role UR ON U.uid = UR.uid
    INNER JOIN t_role R ON UR.role_id = R.role_id
WHERE R.sys_id = @p0 -- first parameter
    AND U.user_name LIKE '%' + @p1 + '%' -- second parameter

另外,我想将结果存储在我定义的类型列表中,如下所示:

public class UserRole
{
    public string UserId { get; set; }
    public string UserName { get; set; }
    public string RoleId { get; set; }
    public string RoleName { get; set; }

    public UserRole(string uid, string uname, string rid, string rname)
    {
        UserId = uid;
        UserName = uname;
        RoleId = rid;
        RoleName = rname;
    }
}

所以在解释我做了什么以及我想要做什么之后,第一个问题是:如何做到这一点?第二:可以通过冗长的形式而不是Lambda表达式完成同样的事情吗?如果有,怎么样?

非常感谢你的时间。

1 个答案:

答案 0 :(得分:4)

这个T-SQL:

SELECT U.uid, U.user_name, R.role_id, R.role_name 
FROM t_user U 
    INNER JOIN t_user_role UR ON U.uid = UR.uid 
    INNER JOIN t_role R ON UR.role_id = R.role_id 
WHERE R.sys_id = @p0 -- first parameter 
    AND U.user_name LIKE '%' + @p1 + '%' -- second parameter 

鉴于您的模型转换为详细的语法(包括使用新模型的要求):

var results = (from u in entities.t_user
              from r in u.t_role
              where r.sys_id == sysIdVariable && u.user_name.Contains(userNameVariable)
              select new UserRole(u.uid, u.user_name, r.role_id, r.role_name))

我知道你没有要求它,但lambda版本可能看起来像:

var results = entities.t_user.Join(entities.t_role, 
                                   x => x.t_role_id, 
                                   x => x.role_id, 
                                  (u, r) => new UserRole(u.uid, 
                                                         u.user_name, 
                                                         r.role_id, 
                                                         r.role_name))
相关问题