2013-07-24 43 views
1

我使用SQL Server 2012和.NET 4從SQL到LINQ,toSql

在SQL我想轉換成C#看起來是這樣的:

SELECT rd.Name, rd.Description, prdv.Value 
FROM RoleDetail rd 
    JOIN Role r ON r.RoleID = rd.RoleID 
    JOIN PersonRole pr ON pr.RoleID = r.RoleID 
    LEFT OUTER JOIN PersonRoleDetailValue prdv ON prdv.RoleDetailID = rd.RoleDetailID 
WHERE pr.PersonID = 42 

多次嘗試和後多浪費時間,當我開始時,我似乎並沒有變得更好。任何幫助表示讚賞。

我更喜歡方法語法,但是查詢語法解決方案也是值得歡迎的。

解決方案(感謝大衛以下B的回答)

下面是兩種可行的解決方案。我希望其他人能夠受益...

方法語法:

var methodSyntax = db.PersonRoles 
    .Where(pr => pr.PersonID == 42) 
    .SelectMany(pr => pr.Role.RoleDetails) 
    .SelectMany(rd => rd.PersonRoleDetailValues.DefaultIfEmpty(), (rd, prdv) => new 
     { 
      Name = rd.Name, 
      Description = rd.Description, 
      Value = prdv.Value 
     }); 

查詢語法:

var querySyntax = from pr in db.PersonRoles 
    where pr.PersonID == 42 
    let r = pr.Role 
    from rd in r.RoleDetails 
    from prdv in rd.PersonRoleDetailValues.DefaultIfEmpty() 
    select new 
    { 
     Name = rd.Name, 
     Description = rd.Description, 
     Value = prdv.Value 
    }; 

謝謝

+2

你有沒有想過下載Linqer或LinqPad? – MethodMan

+0

@DJKRAZE,不,我沒有,謝謝。 Linqer的成本,但我會給LinqPad一個去。 – PostureOfLearning

+0

這個問題爲什麼被拒絕投票?聽到有理由的評論會很好,這樣我就可以改進。 – PostureOfLearning

回答

2

如果你的映射是否設置正確,你的類型之間應該有導航屬性。這使您可以啓動一個關於一種類型的查詢幷包含其他類型,而無需反覆指定連接的列。

from pr in dataContext.PersonRoles 
where pr.PersonId = 42 
    //navigation property Many->One Queryable.Select 
let r = pr.Role 
    //navigation property One->Many Queryable.SelectMany 
from rd in r.RoleDetails 
    //navigation property One->Many, match null if none 
from prdv = rd.PersonRoleDetailValues.DefaultIfEmpty() 
select new 
{ 
    Name = rd.Name, 
    Description = rd.Description, 
    Value = prdv.Value 
} 

爲了好玩,因爲簡潔的方法,語法,我可以得到:

dataContext.PersonRoles 
    .Where(pr => pr.PersonId = 42) 
    .SelectMany(pr => pr.Role.RoleDetails) 
    .SelectMany(rd => rd.PersonRoleDetailValues.DefaultIfEmpty(), 
    (rd, prdv) => new 
    { 
    Name = rd.Name, 
    Description = rd.Description, 
    Value = prdv.Value 
    }); 
+0

謝謝你的幫助。非常感謝,並幫助我理解使用Linq。您的解決方案需要稍加修改才能工作,這就是爲什麼我在帖子中添加了解決方案的原因,但您可以獲得最佳答案剔號;) – PostureOfLearning

+0

噢,用+1語法解決問題...... – PostureOfLearning