繁体   English   中英

Linq 查询在 C# 中不起作用 ASP.NET 当我使用完全外部联接时

[英]Linq query doesn't work in C# ASP.NET Core when I use full outer join

这些是我的课程 map 到我的数据库

public class Course
{
    [Key]
    public int CourseID { get; set; }
    [Required]
    public string Title { get; set; }
    [Required]
    public string Description { get; set; }
    public bool? IsPublish { get; set; }
    public bool? HaveSupport { get; set; }
    [Required]
    public string TimeDuration { get; set; }
    public string Price { get; set; }
    public int CoachID { get; set; }
    public DateTime? PublishDate { get; set; }
    public bool? Delete { get; set; }
    public int PublisherID { get; set; }

    public virtual List<Course_Coach> Course_Coaches { get; set; }
    public virtual List<Course_Publisher> Course_Publishers { get; set; }
    public virtual List<Course_Category> Course_Categories { get; set; }
}

public class Course_Publisher
{
    public int CourseID { get; set; }
    public int PublisherID { get; set; }

    public virtual Course Course { get; set; }
    public virtual Publisher Publisher { get; set; }
}

public class Publisher
{
    [Key]
    public int PublisherID { get; set; }

    [Required]
    public string PublisherName { get; set; }

    public string Description { get; set; }
    public string Address { get; set; }
    public string PhoneNumber { get; set; }

    public virtual List<Coach> Coaches { get; set; }
    public virtual List<Course_Publisher> Course_Publishers { get; set; }
}

public class Course_Coach
{
    public int CourseID { get; set; }
    public int CoachID { get; set; }

    public virtual Course Course { get; set; }
    public virtual Coach Coach { get; set; }
}

public class Coach
{
    [Key]
    public int CoachID { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string Family { get; set; }

    public string Description { get; set; }

    public string PhonNumber { get; set; }
    public DateTime? RegisterDate { get; set; }

    public virtual List<Course_Coach> Course_Coaches { get; set; }
    public virtual Publisher Publisher { get; set; }
    public virtual List<Coach_CoachCategory> Coach_CoachCategories { get; set; }
}

我的问题是:但是,我尝试了几种模型,但每次我都无法获取 publishername 和 coachname 值。

这是我的查询:

public List<CoursesIndexViewModel> GetAllCourses()
{
    List<CoursesIndexViewModel> viewModel = new List<CoursesIndexViewModel>();

    string categoryName = "";
    string publisherName = "";
    string coachName = "";

    var getAllCourses = (from c in _Context.Courses
                         join coachCourse in _Context.Course_Coaches on c.CourseID equals coachCourse.CourseID into coachcourseinto 
                         from coach_course in coachcourseinto.DefaultIfEmpty()
                         join justcoach in _Context.Coaches on coach_course.CoachID equals justcoach.CoachID into coachinto 
                         from coach in coachinto.DefaultIfEmpty()
                         join pc in _Context.Course_Publishers on c.CourseID equals pc.CourseID into pcinto 
                         from publisher_course in pcinto.DefaultIfEmpty()
                         join p in _Context.Publishers on publisher_course.PublisherID equals p.PublisherID into publisherinto 
                         from publisher in publisherinto.DefaultIfEmpty()
                         join category_ccourse in _Context.Course_Categories on c.CourseID equals category_ccourse.CourseID into coursecategory 
                         from categories in coursecategory.DefaultIfEmpty()
                         join category in _Context.Categories on categories.CategoryID equals category.CategoryID into categoryinto 
                         from justcategory in categoryinto.DefaultIfEmpty()
                         where (c.Delete == false)
                         select new
                             {
                                 c.CourseID,
                                 c.Title,
                                 c.Description,
                                 c.Price,
                                 c.TimeDuration,
                                 c.IsPublish,
                                 c.HaveSupport,
                                 c.PublishDate,
                                 c.CoachID,
                                 c.PublisherID,
                                 publishName= c.PublisherID==publisher.PublisherID ? publisher.PublisherName : publisher.PublisherName,
                                 coachName=c.CoachID==coach.CoachID ? coach.Name+" "+coach.Family : coach.Name+" "+coach.Family,
                                 //CoachName=coach_course != null ? coach.Name+" "+coach.Family : "",
                                 //PublisherName=publisher_course !=  null ? publisher.PublisherName : "",
                                 //CoachName=coach_course != null ? coach.Name+" " +coach.Family : coach.Name+" "+coach.Family,
                                 //PublisherName=publisher_course != null ? publisher.PublisherName : publisher.PublisherName,
                                 CategoryName=categories != null ? justcategory.CategoryName : "",

                             }).GroupBy(g=>g.CourseID).Select(a=>new {CourseID=a.Key,CourseGroup=a }).ToList();

        foreach(var it in getAllCourses)
        {
            categoryName = "";
            coachName = "";
            publisherName = "";
            foreach(var item in it.CourseGroup.Select(a => a.CategoryName).Distinct())
            {
                if (categoryName == null)
                {
                    categoryName = item;
                }
                else
                {
                    categoryName = categoryName + " - " + item;
                }
            }

            foreach(var item in it.CourseGroup.Select(c => c.coachName).Distinct())
            {
                if(coachName == null)
                {
                    coachName = item;
                }
            }

            foreach(var item in it.CourseGroup.Select(p => p.publishName).Distinct())
            {
                if (publisherName == null)
                {
                    publisherName = item;
                }
            }

            CoursesIndexViewModel vM = new CoursesIndexViewModel()
            {
                CourseID = it.CourseGroup.First().CourseID,
                Title = it.CourseGroup.First().Title,
                Description = it.CourseGroup.First().Description,
                Price = it.CourseGroup.First().Price,
                TimeDuration = it.CourseGroup.First().TimeDuration,
                IsPublish = it.CourseGroup.First().IsPublish,
                HaveSupport = it.CourseGroup.First().HaveSupport,
                PublishDate = it.CourseGroup.First().PublishDate,
                CoachID = coachName,
                PublisherID = publisherName,
                CategoryID = categoryName
            };

            viewModel.Add(vM);
        }

        return viewModel;
    }

non-using方式和full outer join辅助方式我都试过了,每次都是不完整的结果,也不明白原因。 因为其中一个 full outer join 工作正常

我的问题在哪里? 因为我真的不明白为什么它不能正常工作。 心存感激

non-using方式和full outer join辅助方式我都试过了,每次都是不完整的结果,也不明白原因。

看来你用的是where子句,问题是不是和它有关,尝试去掉它看看能不能得到完整的结果。

根据您的代码,我创建了一个示例并添加了以下数据(课程表、出版商表和教练表包含多对多关系):

在此处输入图像描述

然后,使用如下查询语句查询数据:

        var result = (from c in _context.Courses
                     join coachCourse in _context.Course_Coaches on c.CourseID equals coachCourse.CourseID into coachcourseinto
                     from coach_course in coachcourseinto.DefaultIfEmpty()
                     join justcoach in _context.Coaches on coach_course.CoachID equals justcoach.CoachID into coachinto
                     from coach in coachinto.DefaultIfEmpty()
                     join pc in _context.Course_Publishers on c.CourseID equals pc.CourseID into pcinto
                     from publisher_course in pcinto.DefaultIfEmpty()
                     join p in _context.Publishers on publisher_course.PublisherID equals p.PublisherID into publisherinto
                     from publisher in publisherinto.DefaultIfEmpty()
                     select new
                     {
                         c.CourseID,
                         c.Title,
                         c.Description,     
                         c.CoachID,
                         c.PublisherID,
                         publishName = c.PublisherID == publisher.PublisherID ? publisher.PublisherName : publisher.PublisherName,
                         coachName = c.CoachID == coach.CoachID ? coach.Name + " " + coach.Family : coach.Name + " " + coach.Family, 
                     }).ToList();

结果是这样的:它返回第一个表(课程)中的所有元素。

在此处输入图像描述

此外,从您的代码中,在获取所有课程后,您将按课程 ID 对结果进行分组,并循环遍历课程以在每个类别名称(或发布者名称和教练名称)之间添加指定的分隔符('-')。 我建议你可以尝试使用InCludeThenInClude方法来查询相关数据

        var result2 = _context.Courses
            .Include(c => c.Course_Coaches).ThenInclude(d => d.Coach)
            .Include(c => c.Course_Publishers).ThenInclude(d => d.Publisher)
            .Select(c => new
            {
                Title = c.Title,
                Desctiption = c.Description,
                Publisher = string.Join(",", c.Course_Publishers.Select(d => d.Publisher.PublisherName)),
                Coach = string.Join(",", c.Course_Coaches.Select(d => d.Coach.Name))
            }).ToList();

结果是这样的:在值之间添加分隔符(',')。

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM