2012-02-13 112 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