C# 使用LINQ在C中“合并”SQL结果
各位。我很难找到从N-N关系检索数据的最佳方法 我有以下SQL查询和结果集:C# 使用LINQ在C中“合并”SQL结果,c#,sql,linq,merge,resultset,C#,Sql,Linq,Merge,Resultset,各位。我很难找到从N-N关系检索数据的最佳方法 我有以下SQL查询和结果集: select p.PersonID, Name, PhoneNumber from Persons p left join PhoneNumbers n on p.PersonID = n.PersonID; PersonID Name PhoneNumber ----------- ------------ -------------------- 1
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;
}
非常感谢。您考虑过使用ORM工具吗 ORM,对象关系映射,是一种允许您使用对象范例从数据库查询和操作数据的工具。一般来说,这意味着您将拥有表示表的C对象 这还意味着您可以使用LINQ来查询数据库,而不是SQL。ORM将LINQ转换为SQL,并将执行传递给数据库。在回程中,它会将结果映射到C对象,这对您来说更容易使用 有很多可供选择,但.NET stack上的一些流行选项包括: 微软自己的实现
这就是我最后做的。这远不是最好的,但至少比以前好了
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();
}
是的,我有。我想稍后在其他项目中尝试它,但这次我真的必须使用ADO.NET来完成。非常感谢您能使用LINQ-SQL。您能显示数据库表模式吗?