【问题标题】:How to make use of join in linq having multiple tables and use orderby?如何在具有多个表的linq中使用join并使用orderby?
【发布时间】:2021-04-22 21:46:06
【问题描述】:

我需要一些帮助,我有一个工作连接,需要另一个用于第三张表吗?我怎样才能创建它?我的 orderby 也不适用于 year 并且还需要一些帮助。这是我的逻辑如下,在 sql 中使用 Linq;

 // controller
      public IList<ExtractionViewModel> GetExtractionViewModels()
            {
                ProductionManagementEntities db = new ProductionManagementEntities();
    
                var scheduleList = (from p in db.ProductionDays
                                    join w in db.Weeks on p.WeekId equals w.WeekId
// need other join here for the second table
                                    orderby w.Year ascending // this is not working, year starts in 2017 instead of 2021 downwards
                                    where(w.WeekNum == 9)
                                    
                                  
                                    select new ExtractionViewModel
                                  {
    
                                   Year = w.Year,
                                   Week = w.WeekNum,
                                   Day = p.ProductionDate,
    
    
    
                                    }).ToList();
                return scheduleList;
            }

【问题讨论】:

  • 不确定你对问题的措辞,但听起来你想要降序而不是升序
  • @Keith 年份是降序而不是升序
  • 一切正常。如果要查看 2021,2020,2019 等,则必须使用 orderby w.Year descending
  • @Sergy 是的,现在可以使用 from m.db.table 添加另一个表然后加入吗?我已经尝试过了,但现在返回空记录我卡住了

标签: c# asp.net-mvc linq


【解决方案1】:
// Model
  public class ExtractionViewModel
    {
        public string Year { get; set; }

        public int Week { get; set; }

        public DateTime Day { get; set; }

        public string VW250 { get; set; }

        public string VW270 { get; set; }

        public string VW250_2PA { get; set; }

        public string VW_270_PA { get; set; }
    }

//Controller 


public IList<ExtractionViewModel> GetExtractionViewModels()
        {
            ProductionManagementEntities db = new ProductionManagementEntities();

            var scheduleList = (from p in db.ProductionDays
                                from m in db.Models
                                join w in db.Weeks on p.WeekId equals w.WeekId
                                orderby w.Year descending
                                orderby m.Name ascending
                                where(m.Name== "VW250")
                                where(w.WeekNum == 9)
                                
                              
                                select new ExtractionViewModel
                              {

                                Year = w.Year,
                               Week = w.WeekNum,
                               Day = p.ProductionDate,
                               VW250 = m.Name


                                }).ToList();
            return scheduleList;
        }

【讨论】:

    【解决方案2】:

    使用 Linq 查询,这应该可以工作:

    var scheduleList = (from p in db.ProductionDays
                        join w in db.Weeks on p.WeekId equals w.WeekId
                        join n in db.NewTable on p.WeekId equals n.WeekId
                        where w.WeekNum equals 9 and m.Name equals "VW250"
                        orderby w.Year ascending
                        select new ExtractionViewModel
                        {
                            Year = w.Year,
                            Week = w.WeekNum,
                            Day = p.ProductionDate,
                            Property = n.Property
                        }).ToList();
    

    一个更简单的方法是:

    var scheduleList = db.ProductionDays
                       .Include(x => x.Weeks)
                       .Include(x => x.NewTable)
                       .Where(x => x.Week.WeekNum == 9)
                       .OrderBy(x => x.Week.Year)
                       .Select(x => new ExtractionViewModel {
                             x.Week.Year,
                             x.Week.WeekNum,
                             x.ProductionDate,
                             x.NewTable.Property
                        })
                        .ToList();
    

    第二个是 linq 方法,在调试和单步执行时,我注意到它们似乎比 linq 查询更快。

    您的查询的问题似乎是where 子句的语法。你有where(w.WeekNum == 9) 可能有效,但我从未见过这种语法。使用 linq,我只使用 lambda 表达式或 where property equals value 类型语法。我没有对此进行测试,因此如果出现错误,您可能需要将 .OrderBy() 语句移到底部,但应该没问题。

    在问题中,您没有提到您想要join 的第三张桌子,但指出有第三张桌子。我添加了NewTableNewTable.Property 以指示第三个表及其列/属性之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多