C# 使用linq填充包含数组的列表
我正在使用visjs.net显示时间表 我在编写LINQ以填充包含数组属性的列表时遇到问题 这是visjs文档 和一些示例代码 下面是javascript中示例的简化版本。我需要从MVC控制器而不是javascript填充此JSONC# 使用linq填充包含数组的列表,c#,json,linq-to-sql,asp.net-mvc-5,vis.js,C#,Json,Linq To Sql,Asp.net Mvc 5,Vis.js,我正在使用visjs.net显示时间表 我在编写LINQ以填充包含数组属性的列表时遇到问题 这是visjs文档 和一些示例代码 下面是javascript中示例的简化版本。我需要从MVC控制器而不是javascript填充此JSON var groups = new vis.DataSet(); groups.add([ { id: 1, content: "Lee", nestedGroups: [11,12] } ]);
var groups = new vis.DataSet();
groups.add([
{
id: 1,
content: "Lee",
nestedGroups: [11,12]
}
]);
groups.add([
{
id: 11,
content: "cook",
},
{
id: 12,
content: "shop",
}
]);
剧透警报:我不知道如何填充nestedGroups属性
这是我为它构建的类:
public class TimelineGroups
{
public int id { get; set; }
public string content { get; set; }
public string className { get; set; }
public string orderBy { get; set; }
public string[] nestedGroups { get; set; }
}
这是填充它的控制器方法,不包括nestedGroups属性,它可以正常工作:
public JsonResult EmployeeGroups()
{
List<TimelineGroups> e = (
from emp in db.Employees
where emp.Emp_Status == 1 && emp.EmployeeRole.IsChargeable == "Y"
orderby emp.EmpRole_ID, emp.Emp_Last_Name
select new TimelineGroups()
{
id = emp.Emp_ID,
content = emp.Emp_Name,
orderBy = emp.EmpRole_ID.ToString(),
className = "bte-" + emp.EmployeeRole.EmpRoleName
}
).ToList();
return Json(e, JsonRequestBehavior.AllowGet);
}
public JsonResult EmployeeGroups()
{
清单e=(
来自db员工的emp
其中emp.emp_Status==1&&emp.EmployeeRole.IsChargeable==Y
orderby emp.emp角色\u ID,emp.emp\u姓氏
选择新的TimelineGroups()
{
id=emp.emp\u id,
内容=emp.emp\u名称,
orderBy=emp.EmpRole\u ID.ToString(),
className=“bte-”+emp.EmployeeRole.emploleName
}
).ToList();
返回Json(e,JsonRequestBehavior.AllowGet);
}
这一切都正常工作,但现在我想添加嵌套组
但我不知道将所需数据“透视”到集合中的数组所需的LINQ
这就是我到目前为止所做的:
public JsonResult EmployeeClientGroups()
{
// First load the client list which are children of employees
List<TimelineGroups> cg = (
from sw in db.ScheduleWorks
where sw.EndDate > DateTime.Now
select new TimelineGroups()
{
id = sw.Employee.Emp_ID * 1000 + sw.CustomerId,
content = sw.Customer.Customer_Name
}).Take(1000).Distinct().ToList();
// now load the employee list
// This includes client children
List<TimelineGroups> eg = (
from sw in db.ScheduleWorks
where sw.EndDate > DateTime.Now
select new TimelineGroups()
{
id = sw.Employee.Emp_ID,
// How do I populate this with sw.Employee.Emp_ID * 1000 + sw.CustomerId
nestedGroups = // What magic do I put here?
content = sw.Employee.Emp_Name,
}).Take(1000).Distinct().ToList();
// Add the employee groups to the client groups
cg.AddRange(eg);
return Json(cg, JsonRequestBehavior.AllowGet);
}
public JsonResult EmployeeClientGroups()
{
//首先加载作为员工子女的客户机列表
列表cg=(
来自db.ScheduleWorks中的sw
其中sw.EndDate>DateTime.Now
选择新的TimelineGroups()
{
id=sw.Employee.Emp_id*1000+sw.CustomerId,
内容=sw.Customer.Customer\u名称
}).Take(1000.Distinct().ToList();
//现在加载员工列表
//这包括客户的孩子
列表eg=(
来自db.ScheduleWorks中的sw
其中sw.EndDate>DateTime.Now
选择新的TimelineGroups()
{
id=sw.Employee.Emp_id,
//如何使用sw.Employee.Emp_ID*1000+sw.CustomerId填充此文件
nestedGroups=//我在这里放了什么魔法?
content=sw.Employee.Emp_Name,
}).Take(1000.Distinct().ToList();
//将员工组添加到客户端组
cg.AddRange(eg);
返回Json(cg,JsonRequestBehavior.AllowGet);
}
我需要获取给定员工的所有客户机ID,并将它们“透视”到一个数组中,适合作为JSON发回
要使它们唯一并匹配子id,我需要输入的值为:
sw.Employee.Emp_ID*1000+sw.CustomerId
这可以在LINQ语句中内联完成吗?因此,事实证明这是一种回答,但我将记录我的解决方案 这是我最终使用的代码:
public class TimelineGroups
{
public string id { get; set; }
public string content { get; set; }
public string className { get; set; }
public string orderBy { get; set; }
public List<string> nestedGroups { get; set; }
}
List<TimelineGroups> eg = (
from sw in db.ScheduleWorks
where sw.EndDate > DateTime.Now
where sw.Employee.Emp_Status == 1
group (sw.EmployeeId.ToString() + "." + sw.CustomerId.ToString())
by new {
id = sw.EmployeeId.ToString(),
EmpName = sw.Employee.Emp_Name,
EmpOrder = sw.Employee.EmpRole_ID.ToString()
}
into g
select new TimelineGroups()
{
id = g.Key.id,
// find the list of employee+client keys
nestedGroups = g.ToList(),
content = g.Key.EmpName,
orderBy = g.Key.EmpOrder
})
.Take(1000)
.ToList();
公共类时间线组
{
公共字符串id{get;set;}
公共字符串内容{get;set;}
公共字符串类名{get;set;}
公共字符串orderBy{get;set;}
公共列表嵌套组{get;set;}
}
列表eg=(
来自db.ScheduleWorks中的sw
其中sw.EndDate>DateTime.Now
其中sw.Employee.Emp_Status==1
组(sw.EmployeeId.ToString()+“+sw.CustomerId.ToString())
由新{
id=sw.EmployeeId.ToString(),
EmpName=sw.Employee.Emp_Name,
EmpOrder=sw.Employee.EmpRole\u ID.ToString()
}
进入g
选择新的TimelineGroups()
{
id=g.Key.id,
//查找员工+客户机密钥列表
nestedGroups=g.ToList(),
content=g.Key.EmpName,
orderBy=g.Key.EmpOrder
})
.取(1000)
.ToList();
- 注:无
Distinct
的参数是保存我要“透视”的值的字段group
- 然后,
后面的部分是将分组的实际“键”by
- 我需要使用
而不是数组(也许我可以使用List()
)ToArray
- 将其分组到中间变量
中后,可以使用g
获取“枢轴”值g.ToList()
@Tetsuya Yamamoto fiddle为我指出了正确的方向AFAIK您可以在LINQ
select
中执行加法,但在本例中,您尝试将int
值插入到字符串[]
数组中,这肯定是无效的强制转换。检查此简化小提琴,并告诉我您是否要向nestedGroups
声明新字符串[]
。感谢您花时间设置小提琴。今晚我要试试这个办法。我希望这真的是那么容易!对于您精心准备的示例数据,我应该看到列表中的一个成员,Id=1234,nestedGroups=(1,2,3,4,5,6的数组)。我试过之后会给你回复我想这是我的答案,但我正在努力理解@TetsuyaYamamoto的语法,再次感谢你花时间为我制作小提琴。我希望你不介意,我把你的小提琴拉得更远了一点,并记录了我的结果。