【问题标题】:"Merge" SQL results in C# with LINQ使用 LINQ 在 C# 中“合并”SQL 结果
【发布时间】:2015-01-19 03:26:53
【问题描述】:

每个人。我无法找到从 N-N 关系中检索数据的最佳方法...

我有以下 SQL 查询和结果集:

select
    p.PersonID,
    Name,
    PhoneNumber
from Persons p
left join PhoneNumbers n on p.PersonID = n.PersonID;

PersonID    Name         PhoneNumber
----------- ------------ --------------------
1           John         1111111
1           John         2222222
1           John         3333333
2           Maria        4444444
2           Maria        5555555
3           Billy        6666666

我想在我的客户端应用程序 (C#) 中将这些结果解析为一组对象。现在我有以下代码,但我想知道是否有更好的方法来做到这一点......

public class Person
{
    public int ID;
    public string Name;
    public List<PhoneNumbers> PhoneNumbers = new List<PhoneNumbers>();
}

public class PhoneNumbers
{
    public Person Owner;
    public string PhoneNumber;
}

public List<Person> GetPersons()
{
    const string query = @"select
                             p.PersonID,
                             Name,
                             PhoneNumber
                           from Persons p
                           left join PhoneNumbers n on p.PersonID = n.PersonID;";

    DataTable dataTable = Select(query);

    var groups = from row in dataTable.Rows.Cast<DataRow>()
                 group row by row["PersonID"];

    List<Person> persons = new List<Person>();
    foreach (var group in groups)
    {
        Person person = new Person
        {
            ID = (int)group.ElementAt(0)["PersonID"],
            Name = group.ElementAt(0)["Name"] as string
        };

        foreach (var row in group)
        {
            person.PhoneNumbers.Add(new PhoneNumbers
            {
                Owner = person,
                PhoneNumber = row["PhoneNumber"] as string
            });
        }

        persons.Add(person);
    }

    return persons;
}

非常感谢。

【问题讨论】:

  • 您可以使用 LINQ-SQL。你能显示数据库表模式吗?

标签: c# sql linq merge resultset


【解决方案1】:

这就是我最终要做的。这远不是最好的,但至少比以前更好了。

public class Person
{
    public int ID;
    public string Name;
    public List<PhoneNumbers> PhoneNumbers;
}

public class PhoneNumbers
{
    public int PersonID;
    public string PhoneNumber;
}

public List<Person> GetPersons()
{
    const string query = @"select
                             p.PersonID,
                             Name,
                             PhoneNumber
                           from Persons p
                           left join PhoneNumbers n on p.PersonID = n.PersonID;";

    DataTable dataTable = Select(query);

    return (from row in dataTable.Rows.Cast<DataRow>()
        group row by row["PersonID"] into rows
        select new Person
        {
            ID = (int) rows.Key,
            Name = rows.First()["Name"] as string,
            PhoneNumbers = (from r in rows
                select new PhoneNumbers
                {
                    PersonID = (int) rows.Key,
                    PhoneNumber = rows.First()["PhoneNumber"] as string
                }).ToList()
        }).ToList();
}

【讨论】:

    【解决方案2】:

    您是否考虑过使用 ORM 工具?

    ORM,即对象关系映射,是一种允许您使用对象范例从数据库中查询和操作数据的工具。 一般来说,这意味着您将拥有代表您的表的 C# 对象。

    这也意味着你可以使用 LINQ 来查询你的数据库,而不是 SQLORM 会将 LINQ 转换为 SQL,并将执行传递给数据库。在回程中,它会将结果映射到 C# 对象,这对您来说更容易使用。

    有很多可供选择,但 .NET 堆栈上的一些流行的包括:

    【讨论】:

    • 是的,我有。我想稍后在其他项目中尝试它,但这次我真的必须用 ADO.NET 来做。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 2014-09-28
    相关资源
    最近更新 更多