【问题标题】:Custom Linq query for Entity Framework & ASP.NET MVC app实体框架和 ASP.NET MVC 应用程序的自定义 Linq 查询
【发布时间】:2020-05-11 03:15:46
【问题描述】:

我一直在使用实体框架开发 ASP.NET MVC 应用程序。另外,这是我第一次开发 ASP.NET MVC 应用程序。我一直在努力(近一个月的尝试和谷歌搜索)编写一个 linq 查询以在 jQuery 数据表中显示以下 SQL 查询的结果。它涉及各种左连接,并且某些列具有空值。如果有人可以帮助我解决这个问题,那就太好了。下面有3张表

  1. 资产
  2. 类别
  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

【问题讨论】:

  • 标题和正文只谈论“实体框架”——但标签上写着“EF Core”——那么你真正使用的是哪个?这些是相同的!在 EF Core 与“旧版”EF 中,某些事情的行为不同 .... 另外:如果您 正在 使用 EF Core - 您是否也在使用 ASP.NET Core MVC ? ?请准确描述你的开发环境,并设置正确标签!
  • @marc_s 下次我会尽量准确和清楚

标签: c# asp.net-mvc entity-framework


【解决方案1】:

在应用程序连接的数据库中创建存储过程

CREATE PROCEDURE sp_GetAsset
AS
BEGIN

SELECT 
    Asset.Name AS Name,
    Asset.Type AS Type,
    Asset.Parent_Asset AS ParentAsset,
    Cat.Category AS Category,
    Cat.Parent_Category AS ParentCategory,
    T.BUSINESS_TERM AS BusinessTerm,
    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
);  
END

创建类以获取数据:

public class TestAsset
{
        public string Name           { get; set; }
        public string Type           { get; set; }
        public string ParentAsset    { get; set; }
        public string Category       { get; set; }
        public string ParentCategory { get; set; }
        public string BusinessTerm   { get; set; }
        public string Description    { get; set; }
}

在您的上下文中获取数据

 public class YourContext : DbContext
 {
    public List<TestAsset> GetAssets()
    {
        return this.Query<TestAsset>.FromSql("Exec sp_GetAsset").ToList();
    }
 }

使用 GetAssets 方法

using (YourContext context = new YourContext())
{       
   var list = context.GetAssets();
}

【讨论】:

  • 我无法在我的模型中导入视图。我收到以下错误:错误 6013:表/视图“Metadata.dbo.vwAssets”没有定义主键,无法推断出有效的主键。此表/视图已被排除。要使用实体,您需要检查架构、添加正确的键并取消注释。
  • 你也可以使用存储过程。例如: Create Procedure sp_GetAssets Begin "samet query" END。之后,您可以从 sp 获取数据。例如:context.TestAsset.FromSql("EXEC sp_GetAssets").ToList();注意:您必须创建类并在 TestAssets 等上下文中使用。并且所有类属性都必须与 sp 列相同。名称和数据类型。
  • 这是在我的模型中导入 sp 时创建的: public virtual ObjectResult sp_GetAsset() { return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_GetAsset");我如何在控制器中访问它
  • 你能试试这个吗: using (YourContext context = new YourContext()) { var list = context.sp_GetAsset(); }
  • 我在所有列中都得到空值
猜你喜欢
  • 2013-01-22
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
相关资源
最近更新 更多