Linq 查询将一个 table 行连接到另一个 table 多行
Linq query join one table row to another table multiple row
Table 姓名:名单
id | Name
------------
1 |xxxxx
2 |yyyyy
Table 名称:类别
id | Nameid |Categoryid
-----------------
1 |1 |5
2 |1 |4
3 |2 |3
4 |2 |8
我需要这样的linq查询结果
id | Name |Categoryid
-----------------
1 |xxxx |5,4
2 |yyyy |3,8
我在 linq 下面试过,但它只显示第一个类别 ID
var list = from n in namelist
join c in category on n.id equals c.nameid
select new
{
n.id,
n.name,
c.categoryid
}
你可以试试String.Join
:
var list = namelist
.Select(n => new {
n.id,
n.name,
categoryids = String.Join(",", category
.Where(c => c.nameid == n.id)
.Select(c => c.categoryid))
});
使用String.Join()
。我修改了你的声明:
var list = from n in namelist
join c in category on n.id equals c.nameid
group g by new { n.id, n.name }
select new
{
id = g.Key.id,
Name = g.Key.name,
Categoryid = String.Join(",", g.Select(x => x.c.categoryid))
}
您可以使用 Group Join 执行此操作,并使用 String.Join
加入组中的所有类别 ID,如下所示:-
var result = (from n in namelist
join c in categories
on n.Id equals c.NameId into g
select new
{
id = n.Id,
Name = n.Name,
CategorieIds = g.Select(x => x.CategoryId)
}).AsEnumerable()
.Select(x => new
{
Id = x.id,
Name = x.Name,
CategoryIds = String.Join(",",x.CategorieIds))
});
首先你在 NameList
和 Category
table 上进行连接,然后使用 ToList
或 AsEnumerable
方法将它们放入对象中,例如
var list = (from n in db.NameList
join c in db.Category on n.id equals c.nameid
select new
{
id = n.id,
Name = n.name,
Categoryid = c.id
}).ToList();
var list2 = from l in list
group by new {l.id, l.Name} into groupings
from g in groupings select new{
g.Key.id,
g.Key.Name,
CategoryId = string.Joing(",", groupings.Where(x=>x.NameId == g.Key.id).Select(y=>y.CategoryId))
};
使用ToList
从数据库中获取数据的好处是,您只需在数据库中进行一次查询,所有需要的记录都会在内存中获取。第二条语句将按 id
和 Name
对这些记录进行分组,并将 string.Join
应用于 CategoryId
。请注意,如果您在 Linq-to-Entities
查询上使用 string.join
方法,它将失败,因为此方法无法转换为 sql 表达式。
Table 姓名:名单
id | Name
------------
1 |xxxxx
2 |yyyyy
Table 名称:类别
id | Nameid |Categoryid
-----------------
1 |1 |5
2 |1 |4
3 |2 |3
4 |2 |8
我需要这样的linq查询结果
id | Name |Categoryid
-----------------
1 |xxxx |5,4
2 |yyyy |3,8
我在 linq 下面试过,但它只显示第一个类别 ID
var list = from n in namelist
join c in category on n.id equals c.nameid
select new
{
n.id,
n.name,
c.categoryid
}
你可以试试String.Join
:
var list = namelist
.Select(n => new {
n.id,
n.name,
categoryids = String.Join(",", category
.Where(c => c.nameid == n.id)
.Select(c => c.categoryid))
});
使用String.Join()
。我修改了你的声明:
var list = from n in namelist
join c in category on n.id equals c.nameid
group g by new { n.id, n.name }
select new
{
id = g.Key.id,
Name = g.Key.name,
Categoryid = String.Join(",", g.Select(x => x.c.categoryid))
}
您可以使用 Group Join 执行此操作,并使用 String.Join
加入组中的所有类别 ID,如下所示:-
var result = (from n in namelist
join c in categories
on n.Id equals c.NameId into g
select new
{
id = n.Id,
Name = n.Name,
CategorieIds = g.Select(x => x.CategoryId)
}).AsEnumerable()
.Select(x => new
{
Id = x.id,
Name = x.Name,
CategoryIds = String.Join(",",x.CategorieIds))
});
首先你在 NameList
和 Category
table 上进行连接,然后使用 ToList
或 AsEnumerable
方法将它们放入对象中,例如
var list = (from n in db.NameList
join c in db.Category on n.id equals c.nameid
select new
{
id = n.id,
Name = n.name,
Categoryid = c.id
}).ToList();
var list2 = from l in list
group by new {l.id, l.Name} into groupings
from g in groupings select new{
g.Key.id,
g.Key.Name,
CategoryId = string.Joing(",", groupings.Where(x=>x.NameId == g.Key.id).Select(y=>y.CategoryId))
};
使用ToList
从数据库中获取数据的好处是,您只需在数据库中进行一次查询,所有需要的记录都会在内存中获取。第二条语句将按 id
和 Name
对这些记录进行分组,并将 string.Join
应用于 CategoryId
。请注意,如果您在 Linq-to-Entities
查询上使用 string.join
方法,它将失败,因为此方法无法转换为 sql 表达式。