0

我有两个模型,分类和子类别,一对多关系。加入问题 - 三张表

然后我有一个名为Notice的模型,它与子类别(SubcategoryId为FK)有一对一的关系。

用户添加他们想监视的子类别。 当子类别内发生某些事情时,他们会注意到它们。

现在我试图让用户得到哪些subcats被监视的概述,这样打印出来的信息:

var SubcatsAndCheckedNotices = 
       from subcat in db.Subcategories 
       join notice in db.Notices.Where(x=>x.CompanyId == company.CompanyId) on subcat.SubcategoryId equals notice.SubcategoryId into prodGroup 
       from item in prodGroup.DefaultIfEmpty() 
       select new CheckedNoticesViewModel() {CategoryId =subcat.CategoryId, Category = subcat.Category, Subcategory = subcat, Checked = (item.SubcategoryId == null ? false : true) }; 

(icon) Category Y 
Subcategory - monitored 
Subcategory - monitored 
Subcategory - not monitored 

(icon) Category X 
Subcategory - not monitored 
Subcategory - monitored 
Subcategory - not monitored 

目前我已经做这样解决了它

这几乎可行,问题是我需要按照上面的说明打印出来,因此需要做出不同的选择(对于类别),并且通过这样做,我失去了访问其他Category属性的权限,例如我需要的Icon属性。

我被卡住了,知道有更好的方法来做到这一点,但我无法弄清楚。

这里是我的模型在全:

public class Category 
    { 
     public int CategoryId { get; set; } 
     public string Icon { get; set; } 
     public string Title { get; set; } 
     public ICollection<Subcategory> Subcategories { get; set; } 
    } 
    public class Subcategory 
    { 
     public int SubcategoryId { get; set; } 
     public string Title { get; set; } 
     public int CategoryId { get; set; } 
     public virtual Category Category { get; set; } 
    } 
    public class Notice 
    { 
     public int NoticeId { get; set; } 
     public int SubcategoryId { get; set; } 
     public virtual Subcategory Subcategory { get; set; }  
     public int CompanyId { get; set; } 
     public virtual Company Company { get; set; } 
    } 

有什么建议?

+0

你不能只使用类别的导航属性,然后打印类别,然后打印它的子类型?或者就查询结果使用GroupBy按类别分组? –

+0

我认为你错过了这一点,我需要为输出(针对每个子类别)合并用户特定的通知。 – Josef

+0

那么你只是想显示子类别中有“公司”添加的通知的类别和子类别?如果是的话,你可以像我建议的那样使用GroupBy而不是Distinct? –

回答

0

我想你正在寻找的是

var Results = db.Notices.Where(x => x.CompanyId == company.CompanyId) 
.Select(x => new CheckedNoticesViewModel() 
{ 
CategoryId = x.Subcategory.CategoryId, 
Category = x.Subcategory.Category, 
Subcategory = x.Subcategory, 
Checked = x.SubcategoryId = null ? false : true 
} 
.GroupBy(y => y.CategoryId); 

foreach(var Result in Results) 
{ 
Print(Result.Key.(Information you want to print)); 
foreach(var CheckedNoticesViewModel in Result) 
{ 
Print(CheckedNoticesViewModel.(Information you want to print); 
} 
} 

编辑:没这也许:

foreach(var Category in db.Categories) 
{ 
Print(Category.Title); 
foreach (var SubCategoryNotice in Category.Subcategories.GroupJoin(db.Notices, x => x.SubcategoryId, y => y.SubcategoryId, (x, y) => new { SubCategory= x, Notice =y })) 
{ 
Print(SubCategoryNotice.SubCategory.Title + " " + (SubCategoryNotice.Notice.Any(x => x.CompanyId == 1) ? true: false)); 
} 

}

+0

嗯,x和y是不可能的,“不能解析符号'X'”。 – Josef

+0

对不起,添加了x =>新的CheckedNoticesViewModel,虽然你最后的评论表明我的第一个想法实际上并不是你想要的。如果你想打印所有的类别和子类型,并且只有在被监视时才会被标记,我会选择2. –

+0

不要认为选项2会起作用,noticeid和notice不能通过子类别模型访问。 – Josef

0

我解决它采取另一种方法。

一个查询获取检查的子类别,发送它与类别一起查看。 打印出类别和子类别,然后检查checkNotices中是否存在子类别。而不是试图加入一切。

   ViewBag.Categories = db.Categories.ToList(); 


      var checkedNotices = 
       from subcategory in db.Subcategories 
       join notice in db.Notices.Where(x => x.CompanyId == company.CompanyId) on subcategory.SubcategoryId 
        equals notice.SubcategoryId 
       select 
        new CheckedNoticesViewModel() 
         { 
          CategoryId = subcategory.CategoryId, 
          SubcategoryId = subcategory.SubcategoryId, 
         }; 

      return View(checkedNotices.ToList());