【问题标题】:Populate two table data using ASP.NET Core使用 ASP.NET Core 填充两个表数据
【发布时间】:2021-06-08 01:53:20
【问题描述】:

我想在 ASP.NET Core 中获取两个表数据。我可以通过使用模型类来获得一个表格的详细信息。然后我可以使用下面的代码显示数据。

[HttpGet]
public async Task<ActionResult<IEnumerable<OrderMaster>>> GetOrderDetails()
{
    return await _context.OrderDetails.ToListAsync();
}

所以我的问题是如何获取两个表数据到上述方法?例如,我想检索以下查询的数据:

select a.ItemDescription,a.Quantity,a.Amount, a.CustomerCode, b.CustomerName,b.CustomerAddress,b.MobileNumber,b.Email from OrderDetails as a left join CustomerDetails as b ON a.CustomerCode=b.CustomerCode

谢谢

我的模型类

public class CustomerMaster
    {
        [Key]
        public int CustomerCode { get; set; }

        [Column(TypeName = "nvarchar(100)")]
        public string CustomerName { get; set; }

        [Column(TypeName = "nvarchar(100)")]
        public string CustomerAddress { get; set; }

        [Column(TypeName = "nvarchar(10)")]
        public string MobileNumber { get; set; }

        [Column(TypeName = "nvarchar(100)")]
        public string Email { get; set; }
    }

public class OrderMaster
    {
        [Key]
        public int OrderId { get; set; }

        [Column(TypeName = "nvarchar(100)")]
        public string ItemCode { get; set; }

        [Column(TypeName = "nvarchar(100)")]
        public string ItemName { get; set; }

        [Column(TypeName = "nvarchar(MAX)")]
        public string ItemDescription { get; set; }

        [Column(TypeName = "nvarchar(100)")]
        public string Quantity { get; set; }

        [Column(TypeName = "nvarchar(100)")]
        public string OrderDate { get; set; }

        [Column(TypeName = "nvarchar(100)")]
        public string Amount { get; set; }

        [Column(TypeName = "nvarchar(100)")]
        public string CustomerCode { get; set; }

    }

这是我的上下文类

public class AppDbcontext : DbContext
    {
        public AppDbcontext(DbContextOptions<AppDbcontext> options) : base(options)
        {
        }
        public DbSet<CustomerMaster> CustomerDetails { get; set; }
        public DbSet<OrderMaster> OrderDetails { get; set; }

        }
    }

【问题讨论】:

  • 能分享一下你的模型吗?
  • 公共类 AppDbcontext : DbContext { public AppDbcontext(DbContextOptions options) : base(options) { } public DbSet CustomerDetails { get;放; } 公共 DbSet OrderDetails { 获取;放; } } } //这是我的模型上下文类
  • public class OrderMaster { [Key] public int OrderId { get;放; } [Column(TypeName = "nvarchar(100)")] public string ItemCode { get;放; } [Column(TypeName = "nvarchar(100)")] public string ItemName { get;放; } [Column(TypeName = "nvarchar(MAX)")] public string ItemDescription { get;放; } }
  • public class CustomerMaster { [Key] public int CustomerCode { get;放; } [Column(TypeName = "nvarchar(100)")] 公共字符串 CustomerName { get;放; } [Column(TypeName = "nvarchar(100)")] 公共字符串 CustomerAddress { get;放; } }
  • 有两个模型类。我想在一张表中获取两个表的详细信息。

标签: sql-server asp.net-mvc asp.net-core asp.net-web-api entity-framework-core


【解决方案1】:

关于如何连接两个表,你可以按照一个简单的演示:

var model = (from a in _context.CustomerDetails 
            join b in _context.OrderDetails 
            on a.ID equals b.ID
            select  new { 
                    Name = a.Name,
                    Address = b.Address
            }).ToList();

更新 1:

你使用左连接sql,你需要改变如下:

var model = (from a in _context.OrderDetails
                join b in _context.CustomerDetails
                on a.CustomerCode equals b.CustomerCode.ToString() into ab
                from b in ab.DefaultIfEmpty()
                select new
                {
                    ItemDescription = a.ItemDescription,
                    Quantity = a.Quantity,
                    Amount = a.Amount,
                    CustomerCode = a.CustomerCode,
                    CustomerName = b.CustomerName,
                    CustomerAddress = b.CustomerAddress,
                    MobileNumber = b.MobileNumber,
                    Email = b.Email,
                }).ToList();

更新 2

关于如何返回两个表的数据,我觉得更好的方法是创建一个视图模型来展示:

public class OrderDetailViewModel
{
    public string ItemDescription { get; set; }
    public string Quantity { get; set; }
    public string Amount { get; set; }
    public string CustomerCode { get; set; }
    public string CustomerName { get; set; }
    public string CustomerAddress { get; set; }
    public string MobileNumber { get; set; }
    public string Email { get; set; }  
}
[HttpGet]
public IEnumerable<OrderDetailViewModel> GetOrderDetails()
{
    var model = (from a in _context.OrderDetails
                    join b in _context.CustomerDetails
                    on a.CustomerCode equals b.CustomerCode.ToString() into ab
                    from b in ab.DefaultIfEmpty()
                    select new OrderDetailViewModel
                    {
                        ItemDescription = a.ItemDescription,
                        Quantity = a.Quantity,
                        Amount = a.Amount,
                        CustomerCode = a.CustomerCode,
                        CustomerName = b.CustomerName,
                        CustomerAddress = b.CustomerAddress,
                        MobileNumber = b.MobileNumber,
                        Email = b.Email,
                    }).ToList();
    return model;
}

【讨论】:

  • 是啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊。。。。。
【解决方案2】:

您必须通过导航属性连接两个模型。类似的东西

public class Table1 {
    int Table1Id;
    string Name;
    ICollection<Table2> Tables2;
}

public class Table2 {
    int Table2Id;
    string Address;
    Table1 Table1;
}

然后你就可以有你的业务层代码了

[HttpGet]
... GetNameWithAddresses(int id) {
    return (from c in _context.Table1 where c.Table1Id == id
        select new { c.Name, c.Tables2 }).ToList();
}

如果表有主外键关系,如果你脚手架它们会自动为你完成。如果你没有 FK 关系,你必须问问自己为什么

【讨论】:

  • 现在我使用导航属性创建了外键关系。 [HttpGet] public async Task>> GetOrderDetails(int id) { return (from c in _context.Table1 where c.Table1Id == id select new { c.Name, c.Tables2 }).ToList (); }
  • 你能发送 public async Task> GetOrderMaster(int id){} 这个方法吗。它显示了一些错误。
  • @Niranga,因为你使用select new{},它会返回一个匿名类型。所以它不匹配你的返回类型OrderMaster。如果两个表有导航关系,不需要使用匿名输入,只需使用 select new OrderMaster{...} 之类的东西。
  • @Niranga - 首先阅读实体框架教程会很有帮助。在那之后你的一些问题会很明显。微软文档有很好的文档,Julia Lerner 的任何东西都很棒。如果没有对 EF 有更基本的了解,你的问题就无法回答,而你现在还没有。这不是侮辱——我们都去过那里:)
  • 啊,没关系,我的朋友。我正在 ER 中研究这些基础知识。谢谢你帮助我。
【解决方案3】:

使用此代码

using (var context = new AppDbcontext())
{
   var table1 = context.CustomerDetails.ToList();  
   var table2 = context.OrderDetails.ToList();  
}   

【讨论】:

    猜你喜欢
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 2015-04-18
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多