簡體   English   中英

使用SQL從多個表中提取數據並在一個視圖中顯示

[英]Using SQL to pull data from multiple tables and display it in one view

我已經創建了應用程序,並使用了數據庫優先方法。 因此,我使用ADO.net實體數據模型將數據庫添加到項目中,然后以這種方式向其添加控制器,我沒有任何模型可以這么說嗎? 但是無論如何,我已經添加了控制器,並且CRUD已自動添加到每個實體中。

我的問題是,我想在一個網頁上查看許多表中的數據。 我可以通過sql執行此操作,但是如何使用sql提取所需的數據並將其顯示在屏幕上。

為了在Dave A的答案上建立一點點:

我個人喜歡使用數據庫優先EF進行這種類型的檢索。

構建EDMX之后,創建一個簡單,直接的POCO,以模仿您要返回的內容。 一個簡單的例子是:

public class ComplexModelFromMultipleTables
{
   List<Car> Cars { get; set; }
   List<Bike> Bikes { get; set; }
   List<Boat> Boats { get; set; }
}

一旦在數據庫中建立了可反映在EDMX中的關系,就可以通過您喜歡的模式在提供程序中對其進行訪問。 盡管我已經使用映射器構建了更復雜的對象,但是使用簡單的使用模式始終是好的。

public ComplexModelFromMultipleTables GetObject
using (var db = new DBContext())
{
    var model = new ComplexModelFromMultipleTables
    {
        Cars = db.Cars.Where(x => x.CarType == whateveryouwant).ToList(),
        Bikes = db.Bikes.Where(x => x.anotherproperty == whateveryouwant).ToList(),
        Boats = db.Boats.Where(x => x.something else == whateveryouwant).ToList(),
    }
    return model;
}

從您的控制器調用此提供程序,並使用以下命令強烈鍵入視圖

@model ComplexModelFromMultipleTables

在您的視圖頂部。

我假設您是在使用EF Code First方法創建實體模型。

如果我是對的,那么您將使用實體(表映射的類)作為視圖的模型的慣常做法與您產生沖突。

當我第一次搭建頁面時,我經常使用實體作為模型。 但是正如您所發現的那樣,它們很少適用,而且我經常發現自己正在遷移到更健壯的模型。

1)我建議您在“模型目錄”中創建一個類庫。 嵌入使您的班級的幾個實體成員。

例如,您可以具有一個CustomeActivityModel,該模型也具有Customer,Sales和Orders的成員身份。

class CustomeActivityModel
{
      Customers CustomerList { get; set; }
      Sales SalesList { get; set; }
      Orders OrdersList { get; set; }
}

在控制器中,您將填充它們

   ViewResult Index()
{
   CustomeActivityModel Model = new CustomeActivityModel();
   Model.CustomerList EFContext.Customers;
   Model.SalesList EFContext.Sales;
   Model.OrdersList EFContext.Orders;
   Return View(Model);
}

或者,您可以使用EF的Linq功能來包含具有關鍵關系的實體(假設“銷售”具有“客戶”和“訂單”的外鍵)

   ViewResult Index()
{
   Model = EFContext.Sales.include("Customers").include("Orders");
   Return View(Model);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM