0

1 対多の関係である、Category と Subcategory の 2 つのモデルがあります。

次に、Subcategory (SubcategoryId as FK) と 1 対 1 の関係を持つ Notice というモデルを取得しました。

ユーザーは、監視したいサブカテゴリを追加します。そのサブカテゴリ内で何かが起こると、彼らは注目されます。

今、私は情報を印刷しようとしているので、ユーザーは次のように、どのサブキャットが監視されているかについての概要を得ることができます:

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

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

現在、私は次のようにして解決しました:

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 プロパティなどの他のカテゴリ プロパティへのアクセスが失われることです。私が必要とすること。

私は立ち往生しており、これを行うためのより良い方法があることを知っていますが、それを理解できません。

これが私の完全なモデルです:

    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; }
    }

助言がありますか?

4

2 に答える 2

0

私は別のアプローチを取ることでそれを解決しました。

チェックされたサブカテゴリを取得するための 1 つのクエリは、カテゴリと一緒にビューに送信します。カテゴリとサブカテゴリを出力し、サブカテゴリ ID が checkedNotices に存在するかどうかを foreach で確認します。すべてに参加しようとするのではなく。

                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());
于 2013-06-23T09:34:16.997 に答える
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));
 }

}

于 2013-06-21T16:23:30.947 に答える