使用LINQ查询动态数据
本文关键字:数据 动态 查询 LINQ 使用 | 更新日期: 2023-09-27 18:24:15
我有三张表:Houses、Person和PersonHouseAssignments
在我的Houses
-表中,我得到了不同的列,如HouseName
、HouseType
和Description
。
在PeopleHouseAssignments
中,我得到了类似PersonId
和HouseId
的列。
我现在想以以下方式在我的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 }
我假设您的查询将特定于特定的人?也就是说,如果特定的人被分配到名为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
。