In my code I have a page that includes information from 3 different tables. To show this information I make 3 SQL select calls and unite them in one list to pass as Model to my
May be this can helpful to you.
Select the three tables in a single procedure as a separate result sets, and then in the C# side get the result sets and convert it into JSON format, and then from the JSON you can get the each table data into your list.
DataSet dataSet = new DataSet("dataSet");
dataSet.Namespace = "NetFrameWork";
DataTable table = new DataTable();
DataColumn idColumn = new DataColumn("id", typeof(int));
idColumn.AutoIncrement = true;
DataColumn itemColumn = new DataColumn("item");
table.Columns.Add(idColumn);
table.Columns.Add(itemColumn);
dataSet.Tables.Add(table);
for (int i = 0; i < 2; i++)
{
DataRow newRow = table.NewRow();
newRow["item"] = "item " + i;
table.Rows.Add(newRow);
}
dataSet.AcceptChanges();
string json = JsonConvert.SerializeObject(dataSet, Formatting.Indented);
Console.WriteLine(json);
//{
// "Table1": [
// {
// "id": 0,
// "item": "item 0"
// },
// {
// "id": 1,
// "item": "item 1"
// }
// ]
//"Table2": [
// {
// "id": 0,
// "item": "item 0",
// "rate": 200.00
// },
// {
// "id": 1,
// "item": "item 1",
// "rate": 225.00
//}
// ]
// "Table3": [
// {
// "id": 0,
// "item": "item 0",
// "rate": 200.00,
// "UOM" : "KG"
// },
// {
// "id": 1,
// "item": "item 1",
// "rate": 225.00,
// "UOM" : "LTR"
// }
// ]
//}
DO NOT USE UNION. DataAdapter is weapon of choise.
var commandText = "SELECT * FROM Table1; SELECT * FROM Table2;";
var ds = new DataSet();
using (var da = new SqlDataAdapter(commandText, "your cn"))
{
da.Fill(ds);
}
Using:
ds.Tables["Table1"]...
ds.Tables["Table2"]...
You can use UNION ALL
to merge multiple queries.
Do something like this:
SELECT * FROM Table1
UNION ALL
SELECT * FROM Table2
Edit:
You can do this if you want to know where a single record is from:
SELECT *, 1 AS TableName FROM Table1
UNION ALL
SELECT *, 2 AS TableName FROM Table2
This will add another column that can be used to split the array into 3 lists.
You can get multiple result sets in a single request using a DataReader
. You can use it with or without entity framework.
If you are using Entity Framework, you can pass a DbDataReader to ObjectContext.Translate method to translate multiple result set to requested object types. The command which is used to create the data reader can be a stored procedure, or you can simply use a command containing your queries to shape multiple result set.
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();
}
}
}
If you are using SqlDataAdapter, you can simply pass a command containing your queries and then using Fill
, fill a data set. The data adapter itself will use DataReader
behind the scene.
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);
}
Then you can shape the results to List<Table1>
and List<Table2>
.
Assuming you are using EntityFramwork you can use EF Stored procedure that returns multiple result sets. Then map the result tables to your class object. Take a look here or google it. It will take one round to the DB.
You can do something like this
SELECT Info1, Info2
FROM Table1Data
UNION ALL
SELECT Id, Info2
FROM Table2Data;
Then you can parse the result. Depends on the case but you can also consider using a transaction.