2012-02-13 131 views
3

動態數據我有三個表:房屋,人物和PersonH​​ouseAssignments查詢使用LINQ

在我Houses - 表我有不同的列像HouseNameHouseTypeDescription

PeopleHouseAssignments我得到了像PersonIdHouseId列。


現在我想在我的WPF DataGrid中以下列方式顯示此:

名爲HouseNames列包含從我Houses - 表所有可用HouseNames。

我現在在我的數據網格中有一個複選框,應該將當前選定的人員分配給房屋。

[ ] House1 
[x] House2 
[ ] House3 
[x] House4 

這個人被分配到House2和晶華,因爲表 「PersonH​​ouseAssignments」 有兩行:

PersonId | HouseId 
1  | 2 
1  | 4 

我應該如何創建我的LINQ查詢?

我已經嘗試過這樣的事情,但是這沒有奏效:

from p in _dataContext.Houses 
from a in _dataContext.PersonHouseAssignments 
select new {HouseNames = p.HouseName, IsAssigned = a.HouseId == p.Id, Description = a.Description } 

回答

3

我假設你的查詢將具體特定的人?也就是說,如果該特定人員被分配到名爲HouseName的房屋,則您退回館藏中每件物品的IsAssigned價值將爲true?在這種情況下,你可以使用嵌套子查詢:

int personId = 1; 

var query = 
    from h in _dataContext.Houses 
    select new 
    { 
     HouseName = h.HouseName, 
     IsAssigned = 
     (
      from a in _dataContext.PersonHouseAssignments 
      where a.HouseId == h.Id && a.PersonId == personId 
      select a 
     ).Any() 
    }; 

編輯:如果您想包括PersonHouseAssignmentsDescription,你可以使用:

int personId = 1; 

var query = 
    from h in _dataContext.Houses 
    let a = 
    (    
     from pha in _dataContext.PersonHouseAssignments 
     where pha.HouseId == h.Id && pha.PersonId == personId 
     select pha 
    ).FirstOrDefault() 
    select new 
    { 
     HouseName = h.HouseName, 
     Description = a != null ? a.Description : "", 
     IsAssigned = a != null 
    }; 
+0

那麼Description列呢? – Joe 2012-02-13 20:17:45

+0

在最新的編輯中添加。 – Douglas 2012-02-13 20:33:46

+0

這在我們的應用程序中運行良好,非常感謝! – SeToY 2012-02-13 20:44:09

3

您可以使用此一GroupJoin

var query = from h in _dataContext.Houses 
      join a in _dataContext.PersonHouseAssignments 
      on h.Id equals a.HouseId into assignments 
      select new 
      { 
       HouseName = p.HouseName, 
       IsAssigned = assignments.Any(), 
       //.. 
      } 
+0

'IsAssigned'將始終爲'true'。這不包括加入未找到匹配的記錄。 – Joe 2012-02-13 20:17:28

+0

我不這麼認爲 - 通過使用組連接'assignments'可能是一個空集合 - 在'PersonH​​ouseAssignments'表中沒有匹配的房屋將會是這種情況 – BrokenGlass 2012-02-13 20:24:43

3

使用與DefaultIfEmpty

加盟
var query = from house in _dataContext.Houses 
      join assignment in _dataContext.PersonHouseAssignments 
      on house.Id equals assignment.HouseId into results 
      from r in results.DefaultIfEmpty() 
      select new 
      { 
       HouseNames = house.HouseName, 
       IsAssigned = r != null, 
       Description = r != null ? r.Description : string.Empty 
      } 

這將生成SQL,左外連接包括Description

+0

謝謝,喬。這也工作得很好。可悲的是,我找不到來自您的解決方案和道格拉斯解決方案的任何性能差異。由於我不能選擇兩個答案作爲正確的答案,而道格拉斯先回答,我選擇他的帖子作爲答案。我仍然給你一個「投票」,雖然;-) – SeToY 2012-02-13 23:28:49

+0

嘿@SeToY,沒有問題的人!我誠實地享受只是在環中投擲答案。我很高興你解決了你的問題。 – Joe 2012-02-14 03:07:27