【问题标题】:Determine if record has children in LINQ to SQL确定记录在 LINQ to SQL 中是否有子项
【发布时间】:2013-08-23 04:33:24
【问题描述】:

我在具有结构的分层表中 ID、名称、FK_ID、排序键

在 LINQ to SQL 中获取数据非常简单:

var list = from ls in db.myTable
           where ls.FK_ID == levelId
           orderby ls.sortkey ascending
           select ls;

我可以通过链接到下一个 levelId 来遍历树。

但我想不通,如果 LINQ 中有办法检查是否有孩子

我可能会构建一个视图,为每条记录添加一个标志,但如果可能的话,我宁愿在 LINQ 中这样做。

在 SQL 中添加这样一个标志的最佳实践是什么?

我对检查每条记录的想法并不是对性能最友好的解决方案。

【问题讨论】:

  • 这是你写的方法吗?即传入 levelID 作为参数并检查该 Level 是否有任何子级?还是您只想要所有有子级的关卡?
  • @FizzBu​​zz 现在我只在 GridView 中列出数据,然后在名称列上超链接到下一个级别。我正在寻找的是另一个带有标志的列,该标志指示该记录是否有任何子项(布尔值)

标签: c# tsql linq-to-sql


【解决方案1】:

如果你已经正确设置了外键,你应该没有 1 to Many 映射属性吗?

即你可以写

var listWithChildren = list.Where(l => l.Children.Any());

或者往另一个方向发展

var listWithParent = list.Where(l => l.FK_ID != null);

或者使用查询表达式代替fluent

var listWithChildren = from item in list
                       where item.Children.Any()
                       select item;

正如您在 cmets 中要求的布尔标志,您可以这样做

var updatedList = from item in list
                  select new 
                  {
                    Item = item,
                    HasChildren = item.Children.Any()
                  };

【讨论】:

  • 我似乎无法让 Children.Any 工作,似乎不支持该关键字,所以我一定遗漏了一些东西。但我有几个解决方法。要么使用 SQL 创建数据,要么遍历我的 Linq 对象并将其放入 POCO。我可以做一种 item.myTable.Count()
  • 您可以将 .Any() 替换为 .Count() > 0
  • 其实是关键字Children I can't get to work。显然我的 dbml 模型一定有问题。我可以看到 Item.Items 是孩子,Item.Item1 是父亲,但没有像 Children 这样的关键字......
  • Children 只是映射集合的名称。它不是 .NET 关键字。所以是的,如果你用 item.Items.Any() 替换我上面的代码,它应该可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多