Использование предложения Where в Group Join - PullRequest
0 голосов
/ 09 января 2020

Пожалуйста, рассмотрите эти 2 таблицы:

CategoryID            CategoryName            CategoryModel
-----------------------------------------------------------
1                     Book                       1
2                     Shoe                       2
3                     Glass                      1 

и

SubCategoryID      SubCategoryName    CategoryID     SubCategoryModel    OtherColumn1       OtherColum2
---------------------------------------------------------------------
1                  Book1              1                   3
2                  Book2              1                   1
3                  Shoe1              2                   2
4                  Shoe2              2                   2

Я хочу такой запрос:

from a in Category
join b in SubCategory
on a.CategoryID equals b.CategoryID into grpDetail
where a.CategoryModel != b.SubCategoryModel     <----------
select new 
{
     Id = a.CategoryID,
     Count1 = grpDetail.Count(o=>o.OtherColumn1 == 1),
     ...
}

идентификатор проблемы, которую я не могу доступ к b в указанной выше строке. Как я могу написать этот запрос?

Спасибо

Ответы [ 2 ]

2 голосов
/ 10 января 2020

Между категориями и подкатегориями существует прямая связь один ко многим: каждая категория имеет ноль или более подкатегорий; каждая подкатегория принадлежит ровно одной категории, а именно категории, к которой относится внешний ключ SubCategory.CategoryId.

Вы хотите присоединить категорию и подкатегорию к этому внешнему ключу. Вы не хотите, чтобы все комбинации Category-SubCategory совпадали, вам нужны только те, в которых Category.CategoryModel не равен SubCategory.SubCategoryModel.

Из оставшихся записей вы хотите выбрать несколько свойств. Я не вижу свойства GrpDetail в ваших классах, поэтому я не знаю, что вы хотите.

К счастью, вы упоминаете, что ваша проблема в Где:

var result = Categories.Join(SubCategories, // join tables Categories and SubCategories
    category => category.Id,                // from every category take the Id,
    subCategory => subCategory.CategoryId,  // from every subCategory take foreign key CategoryId

    (category, subCategory) => new          // when they match make one new object
    {
       // we need at least Category.CategoryModel and SubCategory.SubCategoryModel
       CategoryModel = category.CategoryModel,
       SubCategoryModel = subCategory.SubCategoryModel,

       // Select other Category properties that you plan to use:
       CategoryId = category.Id,
       ...

       // Select other SubCategory properties that you plan to use:
       ...
})
// we don't want all combinations, only those where
// CategoryModel is not equal to SubCategoryModel
.Where(joinResult => joinResult.CategoryModel != joinResult.SubCategoryModel)

// from the remaining combinations calculate the final result
.Select(joinResult => new
{
    Id = joinResult.CategoryId,
    Count1 = ... // sorry, don't know what property grpDetail does
    ...
});
1 голос
/ 09 января 2020

разделите ваш запрос на 2, сначала присоединитесь к предложению where, а затем добавьте группу по.

...