C# 使用LINQ或实体框架拆分datatable以列出对象C

C# 使用LINQ或实体框架拆分datatable以列出对象C,c#,entity-framework,linq,datatable,C#,Entity Framework,Linq,Datatable,我有一个datatable,它包含一些行,这是使用以下查询连接两个表的结果: SELECT e.Id AS EmpId, e.Name AS EmpName, d.Id AS DeptId, d.Name AS DeptName FROM Departments D JOIN Employees E ON D.Id = E.DeptId 另一方面,我有以下课程: class Employee { public int Id {

我有一个datatable,它包含一些行,这是使用以下查询连接两个表的结果:

SELECT 
    e.Id AS EmpId,
    e.Name AS EmpName,
    d.Id AS DeptId,
    d.Name AS DeptName
FROM  
    Departments D
JOIN 
    Employees E ON D.Id = E.DeptId

另一方面,我有以下课程:

class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string City { get; set; }
    public int DeptId { get; set; }
}

class Department
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual List<Employee> Employees { get; set; }
}
请尝试以下操作:

           List<DataTable> deptTables = dt
                .AsEnumerable()
                .GroupBy(x => x.Field<int>("DeptId"))
                .Select(x => x.CopyToDataTable())
                .ToList();
List deptTables=dt
.可计算的()
.GroupBy(x=>x.Field(“DeptId”))
.Select(x=>x.CopyToDataTable())
.ToList();

或者创建一个字典

            Dictionary<int, DataTable> deptDict = dt.AsEnumerable()
                .GroupBy(x => x.Field<int>("DeptId"))
                .ToDictionary(x => x.Key, y => y.CopyToDataTable());
Dictionary deptDict=dt.aseneumerable()
.GroupBy(x=>x.Field(“DeptId”))
.ToDictionary(x=>x.Key,y=>y.CopyToDataTable());
ILST部门=
表1.AsEnumerable()
.GroupBy(d=>new
{
Id=d.字段(“DeptId”),
Name=d.Field(“DeptName”)
})
.选择(grp=>
新部门
{
Id=grp.Key.Id,
Name=grp.Key.Name
}).ToList();

这个解决方案怎么样:

var view = dt.DefaultView.ToTable(true, "DeptId", "DeptName");
var departments = view.Rows.OfType<DataRow>()
    .ToLookup(row => row["DeptId"])
    .Select(group => new Depatment
        {
            Id = group.Key, // convert somehow
            Name = group.First()["DeptName"], // convert somehow
            Employees = group.Selec(row => new Employee
            {
                Id = row["EmpId"], // convert somehow
                Name = row["EmpName"] // convert somehow
            }).ToList();
        }).ToList();
var view=dt.DefaultView.ToTable(true,“DeptId”,“DeptName”);
var departments=view.Rows.OfType()
.ToLookup(行=>行[“DeptId”])
.选择(组=>新部门
{
Id=group.Key,//以某种方式转换
Name=group.First()[“DeptName”],//以某种方式转换
Employees=group.Selec(行=>新员工
{
Id=row[“EmpId”],//以某种方式转换
Name=行[“EmpName”]//以某种方式转换
}).ToList();
}).ToList();

Hi,你知道吗,那不是一种代码编写服务?如果您能展示一些代码或搜索结果,那就太好了。@vasily.sib因为您可以看到my DataTable包含一个SQL结果集,它表示数据库中两个表之间的联接,这里我真正需要的是将具有所示结果集的数据表转换为给定的DTO类,而不是数据表的平面视图,使其看起来像实体框架,它帮助我单独处理每个实体并深入挖掘嵌套对象。。。明白我的意思了吗?我可以在一个单独的datatable中获取每个表的数据,然后使用LINQ填充列表,但我需要在通过JOIN获取数据后再这样做……如果您有实体框架,为什么要使用datatable和原始sql查询?@AlexanderPetrov这是我正在处理的一个旧应用程序,它使用许多带有经典ADO的datatables,此外,它使用了许多
RowFilter
s,这会使您在调试时丢失数据,因此,我考虑将庞大的数据表转换为一个DTO,其中包含我需要的嵌套DTO,然后,我可以轻松地做我想做的事情。它不起作用。。它提供了无效的匿名类型成员声明符。必须使用成员分配、简单名称或成员声明匿名类型成员access@AhmedNegm好的,我更新它,你能试试吗,如果它现在对你有效,它将不起作用,因为不允许将
数据行的集合
转换为
部门的集合
,这将返回一个包含部门的列表。我知道了您的想法,但代码有一个问题,因为没有
数据表
ToLookup
实现。。。但是这种分组对我来说很好。。。另一方面,你觉得这次演出怎么样?你说得对<代码>行未实现
IEnumerable
,因此需要调用
of type()
(或
Cast()
)调用。至于性能,这应该足够快。你无论如何都可以测试它。
IList<Department> departments =
        table.AsEnumerable()
        .GroupBy(d => new
        {
            Id = d.Field<Int32>("DeptId"),
            Name = d.Field<String>("DeptName")
        })
        .Select(grp =>
            new Department
            {
                Id = grp.Key.Id,
                Name = grp.Key.Name
            }).ToList();
var view = dt.DefaultView.ToTable(true, "DeptId", "DeptName");
var departments = view.Rows.OfType<DataRow>()
    .ToLookup(row => row["DeptId"])
    .Select(group => new Depatment
        {
            Id = group.Key, // convert somehow
            Name = group.First()["DeptName"], // convert somehow
            Employees = group.Selec(row => new Employee
            {
                Id = row["EmpId"], // convert somehow
                Name = row["EmpName"] // convert somehow
            }).ToList();
        }).ToList();