2011-09-28 94 views
3

因爲我剛剛開始使用LINQToEntities,Entity Framework和Lambda表達式,所以我在獲取某些數據時遇到了問題。通過導航屬性獲取數據的Lambda表達式,LINQToEntities

讓我解釋一下我的情況:

我有4個表的數據庫,如下所示:

Database diagram

當我生成數據庫在Visual Studio(2010)模型的結果是這樣的:

Model in Visual Studio

我搜索了一些資料和證明,因爲該表t_us er_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表達式來完成嗎?如果是的話,怎麼樣?

非常感謝您的時間。

+0

+1爲準確提供我們需要的信息來幫助你 – Smudge202

回答

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)) 
+0

好吧現在我感到慚愧,因爲它非常簡單,我最初認爲只能用lambda表達式來完成......雖然這是我第一次看到2個這樣的起源,那麼究竟做了什麼? –

+1

它是(在此示例中)在關係的導航屬性存在時進行連接的簡寫。另一種辦法是(請原諒代碼在評論框中...)'從u中的entities.t_user加入r在entities.t_role上u.t_role_id == r.role_id其中....'你也可以將它用於加入_unrelated_實體,因爲你可以指定不同的密鑰加入他們等等。不要羞愧,雖然,好消息是你的問題是我已經在網站上看到的最好的閱讀整個星期!:-) – Smudge202

+0

嗯,我花了我的甜蜜時間,以確保我包括每一個細節,因爲我不想拉長我的頭髮比需要更長。並感謝您的解釋,我將銘記未來:) –