通过查询 Linq 添加嵌套组到 属性 模型 class ASP.NET
add nested group by query Linq to property model class ASP.NET
我很难通过 linq 查询将分组数据 table 添加到模型 属性。
这是我的模型
public class Ports
{
public String city { get; set; }
}
和这是我的控制器
public ActionResult ShipSchedule()
{
DatabaseContext db = new DatabaseContext();
var Ports = new Ports();
Ports.city = from m in db.ports_data group m by new { m.city } into n select new { n.Key.city };
return View();
}
我已经将模型部分替换为List<>
并再次替换为另一个,但是这部分
Ports.city = (from m in db.ports_data group m by new { m.city } into n select new { newcity = n.Key.city }).ToList();
还是告诉我那部分cannot convert type 'system.collections.generic.list<<anonymous type: string newcity>>' to 'system.collections.generic.list<string>'
有人知道正确的方法吗?
还有一件事,我想在下拉列表中将那部分显示到我的视图中,如果有人有更好的方法的话
这是我的看法
@model example.Models.Ports
@{
List<SelectListItem> listItems = new List<SelectListItem>();
foreach (var mod in Model.city)
{
listItems.Add(new SelectListItem
{
Text = mod.ToString(),
Value = mod.ToString()
});
}
}
@Html.DropDownListFor(model => model.selected, listItems, "-- Select item --")
错误告诉你到底出了什么问题,你有一个字符串但试图为其分配一个列表(两个非常不同的对象),你可以简单地:
public class Ports
{
public List<String> cities { get; set; }
}
这将使该字符串有效,但更好的做法是将“Ports”设为列表并将其用作 List<Port>
,每个端口将包含“city”(以及所有其他端口属性) .
但无论如何要从数据库中获取所有端口,您可能可以这样做:
var ports = db.ports_data.ToList();
这应该会为您提供一个包含数据库中所有端口的列表(无需创建 New Ports()
并填充它,如果您需要按城市分组,它应该很简单:
var ports = db.ports_data.GroupBy(x=>x.city).ToList();
在您提到的评论中您正在获得重复项,因为您可能需要不同的,但如果您不需要重复项,您不应该一开始就向数据库添加重复项,所以我们会触及错误的结束在这里,但无论如何我相信你需要 Distinct() 如果与 select 结合你将只得到城市,如果有重复则不同的城市:
var portsCities = db.ports_data.Select(x=>x.city).Distinct().ToList();
这将导致 List<string>
个城市,全都不同
如您所见,Linq 有很多方法可以准确获取您需要的数据,我会尝试使用它并进行实验,这是最好的学习方法!
我也会尝试使用 LINQ 方法(如上面的示例),如果您是初学者,它更易于管理(更面向对象)您可以查看一些示例 here
我很难通过 linq 查询将分组数据 table 添加到模型 属性。
这是我的模型
public class Ports
{
public String city { get; set; }
}
和这是我的控制器
public ActionResult ShipSchedule()
{
DatabaseContext db = new DatabaseContext();
var Ports = new Ports();
Ports.city = from m in db.ports_data group m by new { m.city } into n select new { n.Key.city };
return View();
}
我已经将模型部分替换为List<>
并再次替换为另一个,但是这部分
Ports.city = (from m in db.ports_data group m by new { m.city } into n select new { newcity = n.Key.city }).ToList();
还是告诉我那部分cannot convert type 'system.collections.generic.list<<anonymous type: string newcity>>' to 'system.collections.generic.list<string>'
有人知道正确的方法吗?
还有一件事,我想在下拉列表中将那部分显示到我的视图中,如果有人有更好的方法的话
这是我的看法
@model example.Models.Ports
@{
List<SelectListItem> listItems = new List<SelectListItem>();
foreach (var mod in Model.city)
{
listItems.Add(new SelectListItem
{
Text = mod.ToString(),
Value = mod.ToString()
});
}
}
@Html.DropDownListFor(model => model.selected, listItems, "-- Select item --")
错误告诉你到底出了什么问题,你有一个字符串但试图为其分配一个列表(两个非常不同的对象),你可以简单地:
public class Ports
{
public List<String> cities { get; set; }
}
这将使该字符串有效,但更好的做法是将“Ports”设为列表并将其用作 List<Port>
,每个端口将包含“city”(以及所有其他端口属性) .
但无论如何要从数据库中获取所有端口,您可能可以这样做:
var ports = db.ports_data.ToList();
这应该会为您提供一个包含数据库中所有端口的列表(无需创建 New Ports()
并填充它,如果您需要按城市分组,它应该很简单:
var ports = db.ports_data.GroupBy(x=>x.city).ToList();
在您提到的评论中您正在获得重复项,因为您可能需要不同的,但如果您不需要重复项,您不应该一开始就向数据库添加重复项,所以我们会触及错误的结束在这里,但无论如何我相信你需要 Distinct() 如果与 select 结合你将只得到城市,如果有重复则不同的城市:
var portsCities = db.ports_data.Select(x=>x.city).Distinct().ToList();
这将导致 List<string>
个城市,全都不同
如您所见,Linq 有很多方法可以准确获取您需要的数据,我会尝试使用它并进行实验,这是最好的学习方法!
我也会尝试使用 LINQ 方法(如上面的示例),如果您是初学者,它更易于管理(更面向对象)您可以查看一些示例 here