Лямбда-выражения для получения данных через свойства навигации, LINQToEntities - PullRequest
3 голосов
/ 28 сентября 2011

У меня проблемы с получением некоторых данных, поскольку я только начинаю использовать LINQToEntities, Entity Framework и Lambda Expressions.

Позвольте мне объяснить мой случай:

У меня есть база данных с 4 таблицами, как показано здесь:

Database diagram

когда я генерирую модель из базы данных в Visual Studio (2010), результат будет следующим:

Model in Visual Studio

Я искал некоторую информацию и оказалось, что, поскольку таблица t_user_role имеет идентификаторы только из своих двух родительских таблиц, она абстрагируется в модели, и вместо этого вы должны использовать свойства навигации.

У меня возникли проблемы с получением информации о роли пользователя в данной системе (как и в следующей функции)

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

Теперь мне нужно реализовать простую функцию поиска, которая будет искать пользователей, которые содержат предоставленную строку, и возвращать идентификатор и имя пользователя (uid, user_name) и информацию об их роли (role_id, role_name) в данной системе (системная информация). у меня есть заранее), поэтому в основном я хочу превратить этот следующий SQL-запрос в лямбда-выражения (имея в виду, что в модели абстрагирована таблица 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;
    }
}

Итак, после объяснения того, что я сделал и что я пытаюсь сделать, первый вопрос: как это можно сделать? Во-вторых: можно ли добиться того же через многословную форму вместо лямбда-выражений? если да, то как?

Заранее большое спасибо за ваше время.

1 Ответ

4 голосов
/ 28 сентября 2011

Этот 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))

Я знаю, что вы не сделалиэто не так, но лямбда-версия может выглядеть так:

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...