Linq to SQL分组子关系
时间:2020-03-06 14:32:59 来源:igfitidea点击:
我正在尝试运行LINQ to SQL查询,该查询在搜索引擎样式列表的网格视图中返回结果。
在下面的简化示例中,是否可以在单个查询中用逗号分隔的列表填充父项拥有的任何子项(NAMESOFCHILDREN)?
var family = from p in db.Parents where p.ParentId == Convert.ToInt32(Request.QueryString["parentId"]) join pcl in db.ParentChildLookup on p.ParentId equals pcl.ParentId join c in db.Children on pcl.ChildId equals c.ChildId select new { Family = "Name: " + p.ParentName + "<br />" + "Children: " + NAMESOFCHILDREN? + "<br />" };
提前致谢。
解决方案
加入将加深基数!我们没有父母名单!
这是一些未经测试的徒手代码。在Linq设计器中添加关系将为我们提供关系属性。 String.Join会将列表放在一起。
我添加了两个可选的方法调用。
凡……任何人都会过滤父母,使其仅过滤那些有孩子的父母。我不确定string.Join在空数组上的行为。
ToList将把Parents拖入内存,进一步的数据库调用将访问孩子。如果我们获得运行时字符串,则可能需要执行此操作。SQL转换程序异常不支持联接。该异常意味着LINQ试图将方法调用转换为SQL Server可以理解并失败的内容。
int parentID = Convert.ToInt32(Request.QueryString["parentId"]); List<string> result = db.Parents .Where(p => p.ParentId == parentID) //.Where(p => p.ParentChildLookup.Children.Any()) //.ToList() .Select(p => "Name: " + p.ParentName + "<br />" + "Children: " + String.Join(", ", p.ParentChildLookup.Children.Select(c => c.Name).ToArray() + "<br />" )).ToList();
另请注意:通常,在将数据正确转义以进行标记之前,我们不希望混合使用数据和标记。
我们可以尝试如下操作:
var family = from p in db.Parents where p.ParentId == Convert.ToInt32(Request.QueryString["parentId"]) join pcl in db.ParentChildLookup on p.ParentId equals pcl.ParentId select new { Family = "Name: " + p.ParentName + "<br />" + string.Join(",",(from c in db.Children where c.ChildId equals pcl.ChildId select c.ChildId.ToString()).ToArray()); };