2

我正在尝试运行 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 />"
             };

提前致谢。

4

3 回答 3

4

你的加入会搞砸你的基数!你没有父母名单!

这是一些未经测试的徒手代码。在 Linq 设计器中添加关系可为您提供关系属性。String.Join 会将列表放在一起。

我添加了两个可选的方法调用。

Where ... Any 会将父母过滤到只有那些有孩子的父母。我不确定 string.Join 在空数组上的行为。

ToList将把父母拉到内存中,孩子将被进一步的数据库调用访问。如果您获得运行时字符串,这可能是必要的。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();

另请注意:通常在数据正确转义以进行标记之前,您不希望混合数据和标记。

于 2008-09-22T16:36:11.067 回答
0

你可以尝试如下:

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());
    };
于 2008-09-22T16:43:56.867 回答
0

用 发布一个老问题的答案groupby。下面的查询将产生公司名称、订单数量和订单 ID,以逗号分隔,来自 Northwind。

var query = from c in north.Customers
                    join o in north.Orders on c.CustomerID equals o.CustomerID
                    select new { c, o };

        var query2 = from q in query
                     group q.o by q.c into g
                     select new { CompanyName = g.Key.CompanyName, 
                                orderCount = g.Count(), 
                                orders = string.Join(",", g.Select(o => o.OrderID)) }
                     into result
                         orderby result.orderCount descending
                     select result;
于 2015-05-08T15:07:39.283 回答