C# MVC:如何从数据库字段中存储的sql查询填充dropdownlist

C# MVC:如何从数据库字段中存储的sql查询填充dropdownlist,c#,asp.net-mvc,kendo-ui,C#,Asp.net Mvc,Kendo Ui,我们正在使用mvc创建一个动态web表单。窗体上的控件之一是下拉列表。为了填充这个动态下拉控件,我们将sql语句存储在单个数据库字段中。我们为什么要这样做,说来话长,但我们面临的一般问题是如何让下拉列表使用此sql字段值动态填充 例如,下面是我们数据库中的一个示例记录。此图像可能太小,无法读取。如果是这样,请尝试右键单击并在新窗口中打开图像(我们使用的字段称为“Sql”): 如您所见,我们有一个名为“Sql”的字段。在这个记录中,我们需要拉取“product_id”作为下拉列表的id字段,“p

我们正在使用mvc创建一个动态web表单。窗体上的控件之一是下拉列表。为了填充这个动态下拉控件,我们将sql语句存储在单个数据库字段中。我们为什么要这样做,说来话长,但我们面临的一般问题是如何让下拉列表使用此sql字段值动态填充

例如,下面是我们数据库中的一个示例记录。此图像可能太小,无法读取。如果是这样,请尝试右键单击并在新窗口中打开图像(我们使用的字段称为“Sql”):

如您所见,我们有一个名为“Sql”的字段。在这个记录中,我们需要拉取“product_id”作为下拉列表的id字段,“product_name”作为下拉列表的文本字段。在sql语句中,第一个字段始终是下拉列表的id。第二个字段始终是下拉列表的文本

这是我目前的下拉列表:

@(Html.Kendo().DropDownList()
      .Name("Filterdropdown")
      .DataTextField("Text")
      .DataValueField("Value")
          .OptionLabel("Select")
                                    //.Events(e => e.Change("change"))
      .BindTo(new List<SelectListItem>() {
          new SelectListItem() {
              Text = "",
              Value = "1"
          },


      })
@(Html.Kendo().DropDownList())
.Name(“Filterdropdown”)
.DataTextField(“文本”)
.DataValueField(“值”)
.选项标签(“选择”)
//.事件(e=>e.Change(“Change”))
.BindTo(新列表(){
新建SelectListItem(){
Text=“”,
Value=“1”
},
})
正如你们所看到的,目前,我并没有使用这个字段来填充我的dropdownlist。所以我的问题是,我如何设置它来填充我的dropdownlist


谢谢

根据您的要求,您必须首先从db获取查询,然后运行它,根据查询结果,您将绑定下拉列表。以下是我在相同场景中尝试的工作代码

控制器代码

Entities ent = new Entities();//This is my dbcontext object
//First i will query the db to get the query stored in table
Query query = ent.Queries.FirstOrDefault();
string sql = query.Query;//I have assigned the query to a string and now i will execute this

//Here i run the query in db against the table employee you need to change this to products.
var list = ent.Employees.SqlQuery(sql).ToList<Employee>();        
//Create List of SelectListItem
List<SelectListItem> selectlist = new List<SelectListItem>();
foreach (Employee emp in list)
{
 //Adding every record to list  
 selectlist.Add(new SelectListItem { Text = emp.Name, Value = emp.Id.ToString() });
}

ViewBag.SelectList = selectlist;//Assign list to ViewBag will access this in view
return View(list);
@Html.DropDownList("ddlname",(IEnumerable<SelectListItem>)ViewBag.SelectList)
Instead of hitting sql server twice you can get your required data in just one query.These are two calls to sql server

Query query = ent.Queries.FirstOrDefault();
var list = ent.Employees.SqlQuery(sql).ToList<Employee>();    
Entities ent=new Entities();//这是我的dbcontext对象
//首先,我将查询数据库以获取存储在表中的查询
Query Query=ent.querys.FirstOrDefault();
string sql=query.query;//我已将查询分配给一个字符串,现在我将执行此操作
//在这里,我在db中对employee表运行查询,您需要将其更改为products。
var list=ent.Employees.SqlQuery(sql.ToList();
//创建SelectListItem的列表
List selectlist=新建列表();
foreach(列表中的员工emp)
{
//将每条记录添加到列表中
添加(新的SelectListItem{Text=emp.Name,Value=emp.Id.ToString()});
}
ViewBag.SelectList=SelectList;//将列表分配给ViewBag将在视图中访问此列表
返回视图(列表);
查看代码

Entities ent = new Entities();//This is my dbcontext object
//First i will query the db to get the query stored in table
Query query = ent.Queries.FirstOrDefault();
string sql = query.Query;//I have assigned the query to a string and now i will execute this

//Here i run the query in db against the table employee you need to change this to products.
var list = ent.Employees.SqlQuery(sql).ToList<Employee>();        
//Create List of SelectListItem
List<SelectListItem> selectlist = new List<SelectListItem>();
foreach (Employee emp in list)
{
 //Adding every record to list  
 selectlist.Add(new SelectListItem { Text = emp.Name, Value = emp.Id.ToString() });
}

ViewBag.SelectList = selectlist;//Assign list to ViewBag will access this in view
return View(list);
@Html.DropDownList("ddlname",(IEnumerable<SelectListItem>)ViewBag.SelectList)
Instead of hitting sql server twice you can get your required data in just one query.These are two calls to sql server

Query query = ent.Queries.FirstOrDefault();
var list = ent.Employees.SqlQuery(sql).ToList<Employee>();    
@Html.DropDownList(“ddlname”,(IEnumerable)ViewBag.SelectList)
这是我刚刚分配给下拉列表的ViewBag值。我没有使用剑道,但我希望这能帮助你走上正轨

更新

Entities ent = new Entities();//This is my dbcontext object
//First i will query the db to get the query stored in table
Query query = ent.Queries.FirstOrDefault();
string sql = query.Query;//I have assigned the query to a string and now i will execute this

//Here i run the query in db against the table employee you need to change this to products.
var list = ent.Employees.SqlQuery(sql).ToList<Employee>();        
//Create List of SelectListItem
List<SelectListItem> selectlist = new List<SelectListItem>();
foreach (Employee emp in list)
{
 //Adding every record to list  
 selectlist.Add(new SelectListItem { Text = emp.Name, Value = emp.Id.ToString() });
}

ViewBag.SelectList = selectlist;//Assign list to ViewBag will access this in view
return View(list);
@Html.DropDownList("ddlname",(IEnumerable<SelectListItem>)ViewBag.SelectList)
Instead of hitting sql server twice you can get your required data in just one query.These are two calls to sql server

Query query = ent.Queries.FirstOrDefault();
var list = ent.Employees.SqlQuery(sql).ToList<Employee>();    
只需一次查询即可获得所需数据,而无需两次访问sql server。这是对sql server的两次调用
Query Query=ent.querys.FirstOrDefault();
var list=ent.Employees.SqlQuery(sql.ToList();
这两个可以组合成这样一个

var list = ent.Employees.SqlQuery(ent.Queries.FirstOrDefault().Query).ToList<Employee>();
var list=ent.Employees.SqlQuery(ent.querys.FirstOrDefault().Query).ToList();

我知道您试图用一些数据填充下拉列表。但是,我不确定您将SQL查询保存在DB表中的原因。可能的原因可能是,为下拉列表提取数据的查询并不总是相同的,您希望通过DB灵活地修改查询。尽管这可能不是问题所在我们有最好的办法来达到你的要求,希望现在能达到你的目的

现在,说到为下拉菜单提取数据的需求,如果您使用ADO.NET和SQL进行查询,那么您可以通过一个简单的子查询/函数轻松实现这一点。但是,由于您的应用程序是基于MVC构建的,您可能会使用实体框架进行数据访问,这使得您只考虑使用LINQ进行查询

幸运的是,虽然LINQ是通过Entity Framework查询DB实体的唯一直接方法,但您也可以通过LINQ执行原始SQL查询!因此,您在这里需要做的就是:

步骤1)使用LINQ获取存储在DB中的SQL查询

sql = DbContextObj.YourQueryTable.ConditionToGetQuery..();
步骤2)对数据实体使用
.SqlQuery(sql)
方法执行步骤1中获得的查询:

DataForDropDown = DbContextObj.YourDataTable.SqlQuery(sql).ToList..(); 

现在,您可以使用HTML助手生成与数据绑定的下拉控件

您的问题不在组合框,而是通过存储在表中的查询检索数据。编写一个存储过程,输入ReportFilterId并返回一个包含两列的表:id、name by EXEC Sql字段中的查询。使用EF检索结果,然后在应用程序中使用。谢谢。我已经实现了Mairaj的解决方案,但我不知道这个功能。很高兴知道:)。至于我为什么在db表中实现sql,这个页面上的控件是100%动态的。意思是,管理员去了这个网站,说我想在这个表单上放置3个文本框、1个复选框和2个下拉框。如果他们决定使用下拉列表,我们会询问他们希望如何填充每个下拉列表。它们可以硬编码项,也可以从db表中查询。这个查询存储在我们的数据库中,因此我们需要从那里检索。再次感谢@Mahesh4b7如果你看我的解决方案,我做了与你描述的完全相同的事情。我已经执行了原始查询,然后执行了为下拉列表获取数据的查询。回答很好,我正在尝试将其用于我的应用程序,但我只想选择某些列,这会引发一个错误
类型为“ClientID”的成员,没有相应的列
,这是正确的,因为我不想ClientID@Djeroen您可以选择某些列,例如
ent.Employess.select(e=>new{EmployeeName=e.Field(“EmpName”)、Age=e.Field(“Age”)}