在一次通话中从多个表中选择

lev*_*ter 13 c# asp.net-mvc sql-server-2008

在我的代码中,我有一个页面,其中包含来自3个不同表格的信息.为了显示这些信息,我做了3个SQL select调用,并将它们统一在一个列表中,作为Model传递给我的视图.我可以用一个SQL调用吗?数据彼此之间没有联系.

我的代码:

public ActionResult Index()
{
    StorePageData PageData = new StorePageData();
    return View(PageData);
}
public class StorePageData
{
     public List<Table1Data> Table1 { get; set; }
     public List<Table2Data> Table2 { get; set; }
     public List<Table3Data> Table3 { get; set; }

     public StorePageData()
     {
          Table1  = //loading from Database1
          Table2  = //loading from Database2
          Table3  = //loading from Database3
     }
}
public class Table1Data
{
     public int Id { get; set; }
     public double Info1 { get; set; }
     public string Info2 { get; set; }
}
public class Table2Data
{
     public int Id { get; set; }
     public List<int> Info1 { get; set; }
     public List<int> Info2 { get; set; }
}
public class Table3Data
{
     public int Id { get; set; }
     public List<string> Info1 { get; set; }
     public List<string> Info2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如果有一种方法可以在一个SQL请求中加载所有3个表,则会显着提高此页面的加载时间.

谢谢.

Rez*_*aei 13

您可以使用a在单个请求中获取多个结果集DataReader.您可以在有或没有实体框架的情况下使用它.

如果您使用的是Entity Framework,则可以传递一个DbDataReaderto ObjectContext.Translate方法,将多个结果集转换为请求的对象类型.用于创建数据读取器的命令可以是存储过程,也可以只使用包含查询的命令来形成多个结果集.

List<Table1> list1;
List<Table2> list2;

using (var cn = new SqlConnection(@"Connection String"))
{
    cn.Open();
    using (var cmd = cn.CreateCommand())
    {
        cmd.CommandText = "SELECT * FROM Table1; SELECT * FROM Table2";
        var reader = cmd.ExecuteReader(); 
        using (var db = new YourDbContext())
        {
            var context = ((IObjectContextAdapter)db).ObjectContext;
            list1 = context.Translate<Table1>(reader).ToList();
            reader.NextResult();
            list2 = context.Translate<Table2>(reader).ToList();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您正在使用SqlDataAdapter,则只需传递包含查询的命令,然后使用Fill填充数据集即可.数据适配器本身将DataReader在场景后面使用.

var connectionString = @"Connection String";
var commandText = "SELECT * FROM Table1; SELECT * FROM Table2;";
var ds = new DataSet();
using (var da = new SqlDataAdapter(commandText, connectionString))
{
    da.Fill(ds);
}
Run Code Online (Sandbox Code Playgroud)

然后你可以将结果整形为List<Table1>List<Table2>.


小智 5

不要使用联合。DataAdapter 是不二之选。

var commandText = "SELECT * FROM Table1; SELECT * FROM Table2;";
var ds = new DataSet();
using (var da = new SqlDataAdapter(commandText, "your cn"))
{
    da.Fill(ds);
}
Run Code Online (Sandbox Code Playgroud)

使用:

ds.Tables["Table1"]...
ds.Tables["Table2"]...
Run Code Online (Sandbox Code Playgroud)