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 个表的主要内容,如果未能解决你的问题,请参考以下文章

数据库~大叔通过脚本升级实体

图解Java机制

Hibernate:如何使用 CONCAT 和 GROUP_CONCAT

String-----字符串的不可变性

mysql函数concat与group_concat使用说明

Concat 中的 Group_Concat 不能使用 NULL 值