C# 如何使用实体框架和ASP.NET选择具有多列的查询并将其放入变量中?
我使用实体框架模型将我的应用程序连接到数据库,并为CRUD操作生成控制器和视图 但是现在,我需要执行这个查询:C# 如何使用实体框架和ASP.NET选择具有多列的查询并将其放入变量中?,c#,asp.net,asp.net-mvc,entity-framework,linq,C#,Asp.net,Asp.net Mvc,Entity Framework,Linq,我使用实体框架模型将我的应用程序连接到数据库,并为CRUD操作生成控制器和视图 但是现在,我需要执行这个查询: select preco_hora, hora_adicional from dbo.Precos where dt_ini_vgcia <= '05/08/2016' and dt_fim_vgcia >= '05/08/2016' 选择preco\u hora,hora\u adicional 来自dbo.Precos 其中dt_ini_vgcia='2016年8
select preco_hora, hora_adicional
from dbo.Precos
where dt_ini_vgcia <= '05/08/2016'
and dt_fim_vgcia >= '05/08/2016'
选择preco\u hora,hora\u adicional
来自dbo.Precos
其中dt_ini_vgcia='2016年8月5日'
并将这两列(preco_hora和hora_adicional)的返回值放入一个变量(或一个对象,任何我可以管理的东西)中
所以,我在这件简单的事情上遇到了一些麻烦。。。无法使代码正常工作。它可以编译,但不工作
我试过这样的方法:
//get the context of the table from the database
private EstacionamentoContext db = new EstacionamentoContext();
string hentrada = "05/08/2016";
var results = db.Precos.SqlQuery(
"select preco_hora, hora_adicional " +
"from db.Precos " +
"where dt_ini_vgcia <= @p0 " +
"and dt_fim_vgcia >= @p0", hentrada
);
return Content("Resultado: = {0}", results.ToString());
//从数据库获取表的上下文
私有EstacionamentoContext db=新的EstacionamentoContext();
string hentrada=“2016年8月5日”;
var results=db.Precos.SqlQuery(
“选择preco_hora,hora_adicional”+
“来自db.Precos”+
“其中dt_ini_vgcia=@p0”,亨特拉达
);
返回内容(“Resultado:={0}”,results.ToString());
但是我没有得到“results”变量的任何值。我试图调试以查看“results”是否得到一些值,但在尝试查看变量内部时出错
那么,我该如何解决这个问题呢?如何创建一个可以接收此返回的对象(或变量)
使用解决方案进行编辑:
代码被更改,LINQ被用来获得更好的代码。感谢@Jaya和@Jeric Cruz对代码的所有帮助
最后的代码是:
var hentrada = DateTime.Parse("05/08/2016");
var results = db.Precos.Where(p => p.dt_ini_vgcia <= hentrada
&& p.dt_fim_vgcia >= hentrada).Select(p => new { p.preco_hora, p.hora_adicional }).FirstOrDefault();
if (results == null)
{
return Content("Não há preço registrado para este período de vigência");
}
else
{
return Content(String.Format("Preço por Hora = {0} e Hora Adicional = {1}", results.preco_hora.ToString(), results.hora_adicional.ToString()));
}
var hentrada=DateTime.Parse(“2016年8月5日”);
var results=db.Precos.Where(p=>p.dt_ini_vgcia=hentrada)。选择(p=>new{p.preco_hora,p.hora_adicional})。FirstOrDefault();
如果(结果==null)
{
返回内容(“Nãhápreço registdo para este período de vigência”);
}
其他的
{
返回内容(String.Format(“Preço por Hora={0}e Hora Adicional={1}”、results.preco_Hora.ToString()、results.Hora_Adicional.ToString());
}
请检查查询中选定的列。我想你错过了下划线
preco\u hora,hora\u adicional
在SqlQuery中插入参数值时,可以尝试添加新的SqlParameters
新的SqlParameter(“@p1”,hentrada)
第二:在linq语句中指定变量
结果将是:
var hentrada = DateTime.Parse("05/08/2016");
var results = db.Precos
.Where(p => p.dt_ini_vgcia >= hentrada && p.dt_ini_vgcia <= hentrada)
.Select(p => new { p.preco_hora, p.hora_adicional });
var hentrada=DateTime.Parse(“2016年8月5日”);
var results=db.Precos
其中(p=>p.dt_ini_vgcia>=hentrada和p.dt_ini_vgcia new{p.preco_hora,p.hora_adicional});
请检查查询中选定的列。我想你错过了下划线
preco\u hora,hora\u adicional
在SqlQuery中插入参数值时,可以尝试添加新的SqlParameters
新的SqlParameter(“@p1”,hentrada)
第二:在linq语句中指定变量
结果将是:
var hentrada = DateTime.Parse("05/08/2016");
var results = db.Precos
.Where(p => p.dt_ini_vgcia >= hentrada && p.dt_ini_vgcia <= hentrada)
.Select(p => new { p.preco_hora, p.hora_adicional });
var hentrada=DateTime.Parse(“2016年8月5日”);
var results=db.Precos
其中(p=>p.dt_ini_vgcia>=hentrada和p.dt_ini_vgcia new{p.preco_hora,p.hora_adicional});
代码中值得注意的两件事是:
查询
检查包含select preco\u hora,hora adicional
->的查询,检查列名hora adicional
中是否有空格,或者看起来是否像hora adicional
返回语句
返回内容(“Resultado:={0}”,results.ToString())
->results.ToString()
这将返回类似于IQueryable
的内容,而不是预期的结果李>
建议
您可以尝试使用LINQ
tosql来避免文本的自由流动和EF的易用性
using System.Linq; //namespace
var hentrada = DateTime.Parse("05/08/2016"); // do the parsing here and not in LINQ query.
var results = db.Precos.Where(p => p.dt_ini_vgcia >= hentrada
&& p.dt_ini_vgcia <= hentrada)
.Select(p => $"{p.preco_hora} {p.hora_adicional}");
// assuming dataType of `dt_ini_vgcia` is DateTime
使用System.Linq//名称空间
var hentrada=DateTime.Parse(“2016年8月5日”);//在这里进行解析,而不是在LINQ查询中。
var结果=db.Precos.其中(p=>p.dt\u ini\u vgcia>=hentrada
&&p.dt_ini_vgcia$“{p.preco_hora}{p.hora_adicional}”);
//假设'dt_ini_vgcia'的数据类型是DateTime
注意:这里的结果类型是字符串的集合,而不仅仅是一个。如果您只希望得到一个结果,请使用SingleOrDefault
代码中值得注意的两件事是:
查询
检查包含select preco\u hora,hora adicional
->的查询,检查列名hora adicional
中是否有空格,或者看起来是否像hora adicional
返回语句
返回内容(“Resultado:={0}”,results.ToString())
->results.ToString()
这将返回类似于IQueryable
的内容,而不是预期的结果李>
建议
您可以尝试使用LINQ
tosql来避免文本的自由流动和EF的易用性
using System.Linq; //namespace
var hentrada = DateTime.Parse("05/08/2016"); // do the parsing here and not in LINQ query.
var results = db.Precos.Where(p => p.dt_ini_vgcia >= hentrada
&& p.dt_ini_vgcia <= hentrada)
.Select(p => $"{p.preco_hora} {p.hora_adicional}");
// assuming dataType of `dt_ini_vgcia` is DateTime
使用System.Linq//名称空间
var hentrada=DateTime.Parse(“2016年8月5日”);//在这里进行解析,而不是在LINQ查询中。
var结果=db.Precos.其中(p=>p.dt\u ini\u vgcia>=hentrada
&&p.dt_ini_vgcia$“{p.preco_hora}{p.hora_adicional}”);
//假设'dt_ini_vgcia'的数据类型是DateTime
注意:这里的结果类型是字符串的集合,而不仅仅是一个。如果只需要一个结果,请使用SingleOrDefault
问题是合乎逻辑的,您需要阅读有关数据连接和绑定的更多信息。使用参数声明变量,如(@p1)。例子是最好的解释。
尝试使用以下方法:
//Connections methods vary use whatever you like
string connectionString = WebConfigurationManager.ConnectionStrings["Your_String_Name"].ConnectionString;
SqlConnection conn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand(conn);
cmd.CommandType = CommandType.Text;
conn.open();
string hentrada = "05/08/2016";
cmd.CommandText = "SELECT preco_hora, hora_adicional FROM db.Precos where
dt_ini_vgcia <= @p1 AND dt_fim_vgcia >= @p2";
cmd.Parameters.Add("@p1", hentrada);
cmd.Parameters.Add("@p2", somthingelse);
//to view the results of select query
DataSet exampledataset = new DataSet(); //data set to hold the data
SqlDataAdapter adapt = new SqlDataAdapter(cmd); // will put the results from cmd inside an adaprter.
adapt.Fill(exampledataset); // data moved from adapter to data set
Gridview1.DataSource = exampledataset; //you can use gridview to present the data or any other tool.
Gridview1.DataBind();
conn.Close();
//连接方法多种多样,可以随意使用
string connectionString=WebConfiguration Manager.connectionString[“您的字符串”
using System.Linq; //namespace
var hentrada = DateTime.Parse("05/08/2016"); // do the parsing here and not in LINQ query.
var results = db.Precos.Where(p => p.dt_ini_vgcia >= hentrada
&& p.dt_ini_vgcia <= hentrada)
.Select(p => $"{p.preco_hora} {p.hora_adicional}");
// assuming dataType of `dt_ini_vgcia` is DateTime
//Connections methods vary use whatever you like
string connectionString = WebConfigurationManager.ConnectionStrings["Your_String_Name"].ConnectionString;
SqlConnection conn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand(conn);
cmd.CommandType = CommandType.Text;
conn.open();
string hentrada = "05/08/2016";
cmd.CommandText = "SELECT preco_hora, hora_adicional FROM db.Precos where
dt_ini_vgcia <= @p1 AND dt_fim_vgcia >= @p2";
cmd.Parameters.Add("@p1", hentrada);
cmd.Parameters.Add("@p2", somthingelse);
//to view the results of select query
DataSet exampledataset = new DataSet(); //data set to hold the data
SqlDataAdapter adapt = new SqlDataAdapter(cmd); // will put the results from cmd inside an adaprter.
adapt.Fill(exampledataset); // data moved from adapter to data set
Gridview1.DataSource = exampledataset; //you can use gridview to present the data or any other tool.
Gridview1.DataBind();
conn.Close();