使用LINQ查询动态数据

本文关键字:数据 动态 查询 LINQ 使用 | 更新日期: 2023-09-27 18:24:15

我有三张表:Houses、Person和PersonHouseAssignments

在我的Houses-表中,我得到了不同的列,如HouseNameHouseTypeDescription

PeopleHouseAssignments中,我得到了类似PersonIdHouseId的列。


我现在想以以下方式在我的WPF数据网格中显示这一点:

一个名为HouseNames的列,包含我的Houses-表中所有可用的HouseNames。

我现在在我的数据网格中有一个复选框,应该将当前选中的人分配给房子。

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

这个人被分配给House2和House4,因为表"PersonHouseAssignments"有两行:

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 }

使用LINQ查询动态数据

我假设您的查询将特定于特定的人?也就是说,如果特定的人被分配到名为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()
    };

编辑:如果要包含PersonHouseAssignments中的Description,可以使用:

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

您可以使用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(),
               //..
            }

使用带有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