EF linq/lambdas 使用 concat 连接 2 个表
Posted
技术标签:
【中文标题】EF linq/lambdas 使用 concat 连接 2 个表【英文标题】:EF linq/lambdas join 2 tables with concat 【发布时间】:2021-10-03 07:09:34 【问题描述】:我想加入 2 个表(人员和属性),表属性对于表人员的一行(名称)有多行,所以我想连接表 B 中的属性值以将它们全部合二为一一个表人姓名的行。
表格示例
人
Name | Age |
---|---|
Jane | 27 |
Joe | 36 |
Jim | 16 |
属性
Name | Property |
---|---|
Jane | Smart |
Jane | Funny |
Jane | Good-looking |
Joe | Smart |
Joe | Workaholic |
Jim | Funny |
Jim | Young |
结果示例:
26 岁以上的人
Name | Properties |
---|---|
Jane | Smart, Funny, Good-looking |
Joe | Smart, Workaholic |
如何在 linq 中使用 lambdas 执行此操作,如何将 string.join 用于 concat?
【问题讨论】:
so Jane Smart,Jane Funny,Jane Goodlooking 是同一个 Jane 27 吗? 简聪明,风趣,好看(简的结果的合并) 指定您正在使用的实体框架的确切版本。 【参考方案1】:据我了解,您正在寻找如何离开连接表以应用 where 条件。这是一个如何链接的例子:
void Main()
var Properties = new List<property>();
Properties.Add(new property("Jane", "Smart"));
Properties.Add(new property("Jane", "Funny"));
Properties.Add(new property("Jane", "Good-looking"));
Properties.Add(new property("Joe" ,"Smart"));
Properties.Add(new property("Joe" ,"Workaholic"));
Properties.Add(new property("Jim" ,"Funny"));
Properties.Add(new property("Jim" ,"Young"));
var People = new List<Person>();
People.Add(new Person("Jane",27));
People.Add(new Person("Joe",36));
People.Add(new Person("Jim",16));
//join tables
People
.GroupJoin(
Properties,
ppl => ppl.Name,
prop => prop.Name,
(ppl, prop) => new Properties = prop, People = ppl
)
.Select(s => s)
//.Where(w=> w.People.Age == 27)
.ToList()
.Dump();
public class property
public string Nameget;set;
public string Property get;set;
public property(string v1, string v2)
Name = v1;
Property = v2;
public class Person
public string Name get;set;
public int Age get;set;
public Person(string n, int a)
Name = n;
Age = a;
已编辑: 检查此查询更新:
var list = People
.GroupJoin(
Properties,
ppl => ppl.Name,
prop => prop.Name,
(ppl, prop) => new Properties = prop, People = ppl
)
.Where(w => w.People.Age == 27)
.Select(s => new lst = s.Properties.Select(ss => ss.Property))
.FirstOrDefault()
.Dump();
string result = String.Join(",", list.lst).Dump();
结果:(如果您取消注释您将过滤的条件)
表格:
更新 2: 填充列表(注释 where 条件):
var list = People
.GroupJoin(
Properties,
ppl => ppl.Name,
prop => prop.Name,
(ppl, prop) => new Properties = prop, People = ppl
)
//.Where(w => w.People.Age == 27)
.Select(s => new s.People.Name,
lst = String.Join(",", s.Properties.Select(ss => ss.Property)))
.ToList()
.Dump();
【讨论】:
感谢您的回答,但我想将一个人的所有属性串起来,例如 li 例如 1 ligne jane --> 聪明、有趣、好看(道具的连接简) 有没有办法让它们(名称和道具列表)在查询中的同一个对象(相同的新对象)中而不是在外部结果字符串中,因为我需要用他们,所以我需要遍历一个相同的对象(每次迭代),它具有名称和相应的道具列表,谢谢 .Select(s => new lst = String.Join(",", s.Properties.Select(ss => ss.Property))) .FirstOrDefault().lst一个列表: .Select(s => new s.People.Name, lst = String.Join(",", s.Properties.Select(ss => ss.Property))) .ToList()以上是关于EF linq/lambdas 使用 concat 连接 2 个表的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate:如何使用 CONCAT 和 GROUP_CONCAT