通过查询 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