在我的代码中,我有一个页面,其中包含来自 3 个不同表的信息。为了显示此信息,我进行了 3 个 SQL 选择调用,并将它们合并在一个列表中,以作为模型传递到我的视图。我可以通过一次 SQL 调用来完成此操作吗?数据之间没有任何联系。
My code:
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; }
}
如果有一种方法可以在一个 SQL 请求中加载所有 3 个表,它将显着缩短该页面的加载时间。
谢谢。
您可以使用以下方法在单个请求中获取多个结果集DataReader
。您可以在有或没有实体框架的情况下使用它。
如果您使用实体框架,则可以传递 to 将多个结果集转换为请求的对象类型的方法。用于创建数据读取器的命令可以是存储过程,或者您可以简单地使用包含查询的命令来形成多个结果集。
Example
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();
}
}
}
如果您正在使用,您可以简单地传递包含查询的命令,然后使用Fill
,填充一个数据集。数据适配器本身将使用DataReader
在幕后。
Example
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);
}
然后您可以将结果调整为List<Table1>
and List<Table2>
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)