Ravi 1001 Ответов: 1

Пользовательский запрос linq для entity framework & ASP.NET приложение MVC


Я работал над одним проектом. ASP.NET приложение MVC с использованием Entity Framework. Кроме того, это мой первый раз, когда я разрабатываю ASP.NET приложение MVC. Я изо всех сил (почти месяц попыток и гугления) пытался написать запрос linq для отображения результатов в jQuery datatable для приведенного ниже SQL-запроса. Он включает в себя различные левые соединения, и некоторые столбцы имеют нулевые значения. Было бы здорово, если бы кто-нибудь мог мне в этом помочь.

Всего их 3 база данных таблицы как показано ниже
  • Активы
  • Категория
  • Срок

SELECT 
    Asset.Name As Name,
    Asset.Type As Type,
    Asset.Parent_Asset As "Parent Asset",
    Cat.Category As Category,
    Cat.Parent_Category As "Parent Category",
    T.BUSINESS_TERM As "Business Term",
    T.SHORT_DESCRIPTION As Description
FROM
    (
        SELECT 
            CH.DISPLAY As Name,
            CH.TYPE AS Type,
            PA.DISPLAY As Parent_Asset,
            CH.CATEGORY_INT_ID
        FROM 
            [Metadata].[dbo].[Asset] CH
            LEFT JOIN [Metadata].[dbo].[Asset] PA 
            ON PA.PARENT_ASSET_ID = CH.ASSET_INT_ID
    ) Asset
    LEFT JOIN 
    (
        SELECT
            CH.DISPLAY AS Category,
            PA.DISPLAY AS Parent_Category,
            CH.CATEGORY_INT_ID AS Category_Id
        FROM
            [METADATA].[dbo].[Category] CH
            LEFT JOIN [METADATA].[dbo].[Category] PA 
            ON PA.PARENT_CATEGORY_ID = CH.CATEGORY_INT_ID
    ) Cat 
    ON Asset.CATEGORY_INT_ID = Cat.Category_Id
    LEFT JOIN [Metadata].[dbo].[Term] T 
    ON T.CATEGORY_INT_ID = Cat.Category_Id


Что я уже пробовал:

Я пробовал хранимую процедуру, но получаю нулевые значения в таблице

Запросы от меня:
<pre> public ActionResult GetData1()
            {
                //Display for Assets Page
                using (MetadataEntities db = new MetadataEntities())
                {
                    List<Asset> c = db.Assets.ToList();
                    List<Category> ct = db.Categories.ToList();
                    List<Term> t = db.Terms.ToList();

  var subQuery1 = from ch in c
                  join pa in c on ch.ASSET_INT_ID equals pa.PARENT_ASSET_ID into tab1
                  from pa in tab1.DefaultIfEmpty()
    
                  select new Asset
                {
                   DISPLAY =ch.DISPLAY,
                   TYPE = ch.TYPE,
                   parentasset = pa.DISPLAY,
                   CATEGORY_INT_ID = ch.CATEGORY_INT_ID
                  };
    
    
var subQuery2 = from CH in ct
              join PA in ct on CH.CATEGORY_INT_ID equals PA.PARENT_CATEGORY_ID into tab2
              from PA in tab2.DefaultIfEmpty()
              select new Category
            {
               DISPLAY = CH == null ? string.Empty : CH.DISPLAY,
               ParentCategory = PA == null ? string.Empty : PA.DISPLAY,
               CATEGORY_INT_ID = CH.CATEGORY_INT_ID
             };
    
var mainQuery = from tab1 in subQuery1
                join Cat in subQuery2 on tab1.CATEGORY_INT_ID equals Cat.CATEGORY_INT_ID                                                                                         
                join term in t on Cat.CATEGORY_INT_ID equals term.CATEGORY_INT_ID 
                                    
                select new Asset
           {
                 DISPLAY = tab1 == null ? string.Empty : tab1.DISPLAY,
                 TYPE = tab1 == null ? string.Empty : tab1.TYPE,
                 parentasset = tab1 == null ? string.Empty : tab1.parentasset,
                 assetcategory = Cat == null ? string.Empty : Cat.DISPLAY,
                 parentcategory = Cat == null ? string.Empty : Cat.ParentCategory,
                 bterm = term == null ? string.Empty : term.BUSINESS_TERM,
                SHORT_DESCRIPTION = term == null ? string.Empty : term.SHORT_DESCRIPTION
            };
    
    
 
                    return Json(new { data = mainQuery }, JsonRequestBehavior.AllowGet);
                }
    
    
            }


Он возвращает 44 557 записей вместо 56932

1 Ответов

Рейтинг:
0

Richard Deeming

Вы можете начать с упрощения вашего SQL - запроса- нет необходимости во вложенных подзапросах:

SELECT 
    A.DISPLAY As Name,
    A.TYPE As Type,
    PA.DISPLAY As "Parent Asset",
    CH.DISPLAY As Category,
    PC.DISPLAY As "Parent Category",
    T.BUSINESS_TERM As "Business Term",
    T.SHORT_DESCRIPTION As Description
FROM
    [Metadata].[dbo].[Asset] A
    LEFT JOIN [Metadata].[dbo].[Asset] PA 
    ON PA.PARENT_ASSET_ID = A.ASSET_INT_ID
    LEFT JOIN [METADATA].[dbo].[Category] CH
    ON CH.Category_Id = A.CATEGORY_INT_ID
    LEFT JOIN [METADATA].[dbo].[Category] PC 
    ON PC.PARENT_CATEGORY_ID = CH.CATEGORY_INT_ID
    LEFT JOIN [Metadata].[dbo].[Term] T 
    ON T.CATEGORY_INT_ID = CH.CATEGORY_INT_ID
;
Предполагая, что у вас есть соответствующие свойства навигации в ваших моделях Entity Framework, это должно быть так же просто, как:
var result = yourDbContext.Assets
    .Select(asset => new
    {
        Name = asset.Display,
        Type = asset.Type,
        Parent_Asset = asset.ParentAsset.Display,
        Category = asset.Category.Display,
        Parent_Category = asset.Category.ParentCategory.Display,
        Business_Term = asset.Category.Term.Business_Term,
        Description = asset.Category.Term.Short_Description
    })
    .ToList();


Maciej Los

Я так и знал! Я это почувствовал! Я был почти на 100% уверен, что вы ответите на этот вопрос. ;)
5ed!

Ravi 1001

Это не работает. Category_Int_Id-это внешний ключ в таблице активов, а Term_Int_ID-внешний ключ в таблице активов. Надеюсь, что есть какое-то другое решение

Richard Deeming

Это описание не соответствует SQL - запросу из вашего вопроса. Вот он, тот самый Term стол соединяется с Category таблица в столбце идентификатор категории.

Если вместо этого он должен быть присоединен к активу, то это простое обновление. В SQL:

LEFT JOIN [Metadata].[dbo].[Term] T 
ON T.TERM_INT_ID = A.TERM_INT_ID

и в запросе LINQ:
Business_Term = asset.Term.Business_Term,
Description = asset.Term.Short_Description