【问题标题】:Using classes instead of anonymous type in join C# WPF Linq在加入 C# WPF Linq 时使用类而不是匿名类型
【发布时间】:2025-12-15 12:45:01
【问题描述】:

我需要从在我的 JOIN 语句中使用 anonymous 类型改为使用 classes。我的编码:

using (DataClassesDataContext DC = new DataClassesDataContext())
{
   var Join = (from a in DC.tblEmployeeLoginDetails
               join b in DC.tblProjects
               on a.LoginID equals b.ProjectID
               join c in DC.tblClientLoginDetails
               on b.ProjectID equals c.ClientLoginID
               where c.ClientLoginID != null
               select new
               { 
                  b.ProjectID, 
                  b.ProjectName, 
                  b.ProjectStatus, 
                  a.EmployeeName, 
                  a.EmployeeSurname,
                  c.ClientName,
                }).ToList();

    dgViewProjects.ItemsSource = Join;
}

我的课程:PIDData & EIDData

PID 数据

public struct PDData
{
    public string _project;

    public int ProjectID { get; set; }
    public string Name { get; set; }
    public string Status { get; set; }
    public string Employee { get; set; }
}

EIDData

    public string _sts;

    public int UserID { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    public string Role { get; set; }
    public string Department { get; set; }
    public string IDNumber { get; set; }
    public string Gender { get; set; }
    public DateTime Date { get; set; }
    public string HomeAddress { get; set; }
    public string Telephone { get; set; }
    public string City { get; set; }
    public string Province { get; set; }
    public Binary SetImage { get; set; }
}

现在我对 c# 和一般编码非常陌生,所以这对我来说有点棘手和令人沮丧。我不知道如何在我的 join 语句中使用我的类而不是匿名类型。

使用这些类将帮助我更轻松地管理程序中数据网格中的数据。请分享任何建议或让我知道是否有更多信息可以帮助我回答问题,谢谢!

编辑:

这是 JOIN 现在的样子:

        using (DataClassesDataContext DC = new DataClassesDataContext())
        {
           List<Match> Join = (from a in DC.tblEmployeeLoginDetails
                        join b in DC.tblProjects
                        on a.LoginID equals b.ProjectID
                        join c in DC.tblClientLoginDetails
                        on b.ProjectID equals c.ClientLoginID
                        where c.ClientLoginID != null
                        select new Match
                        { 
                            ProjectIDM = b.ProjectID, 
                            ProjectNameM = b.ProjectName, 
                            ProjectStatusM = b.ProjectStatus, 

                            EmployeeNameM = a.EmployeeName, 
                            EmployeeSurnameM = a.EmployeeSurname,

                            ClientNameM = c.ClientName,
                        }).ToList();

           dgViewProjects.ItemsSource = Join;
        }

Nautious,我还创建了你建议的课程。

我没有收到任何错误...这很好,但我的 datagridview 中不再显示数据。我想可能是因为这个:

dgViewProjects.ItemsSource = 加入;

【问题讨论】:

  • 伤痕累累。我的坏..匹配类中的字段需要是属性。查看答案编辑
  • 非常感谢 Nautious 付出的时间和精力,解决了问题!

标签: c# wpf linq join datagridview


【解决方案1】:

首先,您创建一个与您希望返回的数据相匹配的类/结构:

public class Match
{
    public int ProjectID { get; set; }
    public string ProjectName { get; set; }
    public object ProjectStatus { get; set; }
    public string EmployeeName { get; set; }
    public string EmployeeSurname { get; set; }
    public string ClientName { get; set; }
}

然后您在select new 中创建并填充实例:

select new Match
{
    ProjectID = b.ProjectID,
    ProjectName = b.ProjectName,
    ProjectStatus = b.ProjectStatus,

    EmployeeName = a.EmployeeName,
    EmployeeSurname = a.EmployeeSurname,

    ClientName = c.ClientName,
}).ToList();

现在,您的变量 Join 将是 List&lt;Match&gt; 类型

【讨论】:

  • 感谢您的评论!请查看我的问题的编辑。 :D 我需要知道如何将项目绑定到我的数据网格,因为那里不再显示任何信息。
【解决方案2】:

如果你想使用一个不属于 DataClassesDataContext 的结构体,你可以使用匿名类型,但是你可以将它转换为你自己的类型

var Join = (from a in DC.tblEmployeeLoginDetails
           join b in DC.tblProjects
           on a.LoginID equals b.ProjectID
           join c in DC.tblClientLoginDetails
           on b.ProjectID equals c.ClientLoginID
           where c.ClientLoginID != null
           select new
                    { 
                        ProjectID = b.ProjectID, 
                         ProjectName = b.ProjectName, 
                        ProjectStatus = b.ProjectStatus, 

                        EmployeeName = a.EmployeeName, 
                        EmployeeSurname = a.EmployeeSurname,

                        ClientName = c.ClientName,
                    }).ToList().Select(x => new PIDData
                   {
         ProjectID = b.ProjectID, 
         Name = b.ProjectName, 
          Status = b.ProjectStatus, 
                   }).ToList() ;

【讨论】:

  • 非常感谢您的评论! :)