【问题标题】:c# linq SELECT list inside another listc# linq SELECT 列表内的另一个列表
【发布时间】:2017-11-29 16:22:39
【问题描述】:

这是我的课程

public class EmployeeProjectMaster
{
    public int EmployeeProjectMasterId { get; set; }
    //Class Variables    
    //Here i wants to get list of EmployeeProjectTransaction 
    //this is the way i tried
     public EmployeeProjectMasterModelClient()
    {
        this.EmployeeProjectTransactionModel = new HashSet<EmployeeProjectTransactionModelClient>();
    }
    public virtual IEnumerable<EmployeeProjectTransactionModelClient> EmployeeProjectTransactionModel { get; set; }    
}
public class EmployeeProjectTransaction
{
    public int EmployeeProjecTransactiontId { get; set; }
    public int EmployeeProjectMasterId { get; set; }
    public int EmployeeId { get; set; }
    public string EmployeeName {get;set;}
    //Class Variables        
}
public class Employee
{
    public int EmployeeId { get; set; }
    public string Employeefullname {get;set;}        
}

然后这里是我的 linq 查询

//Get All Employee Project Details To Grid
    public ActionResult GetAllEmployeeProjectDetails()
    {
        //DataTable Parameter
        var draw = Request.Form.GetValues("draw").FirstOrDefault();
        //Paging parameter
        var start = Request.Form.GetValues("start").FirstOrDefault();
        var length = Request.Form.GetValues("length").FirstOrDefault();
        //Paging parameter
        var sortColumn = Request.Form.GetValues("columns[" + Request.Form.GetValues("order[0][column]").FirstOrDefault() + "][name]").FirstOrDefault();
        var sortColumnDir = Request.Form.GetValues("order[0][dir]").FirstOrDefault();

        //filter parameter
        var searchValue = Request.Form.GetValues("search[value]").FirstOrDefault();

        List<EmployeeProjectMasterModelClient> allEmployeeProject = new List<EmployeeProjectMasterModelClient>();
        int pageSize = length != null ? Convert.ToInt32(length) : 0;
        int skip = start != null ? Convert.ToInt32(start) : 0;
        int recordsTotal = 0;

        //Database Query
        using (InnoESolutionsDbEntities oInnoESolutionsDbEntities = new InnoESolutionsDbEntities())
        {
            var v = (from Epmm in oInnoESolutionsDbEntities.EmployeeProjectMasterModels
                join Eptm in oInnoESolutionsDbEntities.EmployeeProjectTransactionModels
                    on Epmm.EmployeeProjectMasterId equals Eptm.EmployeeProjectMasterId
                select new {Epmm, Eptm});

            if (!string.IsNullOrEmpty(searchValue))
            {
                v = v.Where(b =>
                b.Epmm.ProjectModel.ProjectName.Contains(searchValue)
                );
            }

            if (!(string.IsNullOrEmpty(sortColumn) && string.IsNullOrEmpty(sortColumnDir)))
            {
                //for make sort simpler we will add system.linq.dynamic reference
                //v = v.OrderBy(sortColumn + " " + sortColumnDir);
                v = v.OrderBy(a => a.Epmm.EmployeeProjectMasterId + " " + a.Eptm.EmployeeProjectMasterId);
            }
            recordsTotal = v.Count();
            allEmployeeProject = v.Skip(skip).Take(pageSize).Where(y => y.Epmm.IsActive && !y.Epmm.IsDelete && y.Eptm.IsActive && !y.Eptm.IsDelete).Select(x => new EmployeeProjectMasterModelClient
            {
                EmployeeProjectMasterId = x.Epmm.EmployeeProjectMasterId,
                ProjectId = x.Epmm.ProjectId,
                ProjectName = x.Epmm.ProjectModel.ProjectName,
                WorkDateS = SqlFunctions.DateName("day", x.Epmm.WorkDate) + "/ " + SqlFunctions.DateName("month", x.Epmm.WorkDate) + "/ " + SqlFunctions.DateName("year", x.Epmm.WorkDate),
                SalaryForEachEmployee = x.Epmm.SalaryForEachEmployee,
                EmployeeProjectTransactionModel = *************************************How to Load Trnsaction Details As A list Here

            }).ToList();
        }
        return Json(new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data = allEmployeeProject });

    }

以上c#函数和Linq查询加载角度数据表。它需要在列表中选择列表。 我为加入编写了 linq 查询。我不知道它是否正确。当您回答我的问题时,请考虑该查询。尝试了很多时间,但我失败了。当我尝试将记录输入 allEmployeeProject 时进行查询。如何加载交易详情 作为 allEmployeeProject 列表中的列表星号 表示我需要做什么。我想要特定主记录的员工列表。

这里输出我想要的

MasterId | TransactionId |Employee Id | Employee Name 

---------+---------------+------------+---------------
1        |       1       |      4     | name 1
         |       2       |      2     | name 3

【问题讨论】:

  • 很高兴看到您已经完成的工作,但您能否添加一些示例输入数据和所需的输出?
  • @Oliver 在这里我编辑了我的问题。感谢您的回复
  • 您是否特别需要对数据库执行一次查询以提取一组 记录,并将其转换为主模型列表,每个主模型都包含一个列表他们各自的记录?如果是这样,我建议您需要使用 GroupBy。

标签: javascript c# entity-framework linq angular-datatables


【解决方案1】:

我认为你需要的是 GroupBy 方法。

allEmployeeProject = v.Skip(skip).Take(pageSize).Where(y => y.Epmm.IsActive && !y.Epmm.IsDelete && y.Eptm.IsActive && !y.Eptm.IsDelete).Select(x => new EmployeeProjectMasterModelClient
        {
            EmployeeProjectMasterId = x.Epmm.EmployeeProjectMasterId,
            ProjectId = x.Epmm.ProjectId,
            ProjectName = x.Epmm.ProjectModel.ProjectName,
            WorkDateS = SqlFunctions.DateName("day", x.Epmm.WorkDate) + "/ " + SqlFunctions.DateName("month", x.Epmm.WorkDate) + "/ " + SqlFunctions.DateName("year", x.Epmm.WorkDate),
            SalaryForEachEmployee = x.Epmm.SalaryForEachEmployee
        });

var allEmployeeProjectsByMaster = allEmployeeProject.GroupBy(x => x.EmployeeProjectMasterId).ToList();

现在您可以使用 allEmployeeProjectsByMaster 变量将事务列表按 EmployeeProjectMaster 分组,只需使用 Select 将其映射到相关数据模型。

【讨论】:

  • 你认为这个答案能解决你的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 2011-09-13
  • 2012-05-31
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
相关资源
最近更新 更多