【发布时间】:2016-10-27 14:38:22
【问题描述】:
(注意:在标题中可能有比“动态”更好的词,但我想不出一个。)
我有一个包含多个自引用表的数据库。一个例子如下:
+----------+
| Category |
+----+-----+-+-----------+
| id | title | parent_id |
+----+-------+-----------+
其中parent_id 是同一个表中id 的外键,因此类别可以嵌套在(理论上)无限级别。
以下是该表的示例数据:
Animal
|- Fish
| |- Shark
| \- Trout
\- Mammal
|- Cat
\- Dog
Plant
|- Tree
| |- Fir
| \- Palm
\- Vegetable
|- Cabbage
\- Lettuce
当前使用SqlConnection 对象对数据库执行查询的 .NET 项目可以将上述内容呈现为“平面”字符串,如下所示:
Animal
Animal > Fish
Animal > Fish > Shark
Animal > Fish > Trout
Animal > Mammal
Animal > Mammal > Cat
Animal > Mammal > Dog
Plant
Plant > Tree
Plant > Tree > Fir
Plant > Tree > Palm
Plant > Vegetable
Plant > Vegetable > Cabbage
Plant > Vegetable > Lettuce
它通过使用递归数据库函数来实现这一点,该函数通过获得一个类别的 ID 来返回一个类别的“完整标题”。此函数的结果用于查询的SELECT 列表及其ORDER BY 子句:
select Category.*, dbo.GetFullCategoryName(Category.id) as full_title
from Category
order by dbo.GetFullCategoryName(Category.id)
使用 Entity Framework 和 Linq 做同样事情的最佳方法是什么?
如果有帮助的话,该解决方案仍然可以使用数据库函数来获取完整的标题字符串。
我尝试通过在 Model 类中添加 [NotMapped] 字段来模拟这一点,该字段查询 DbSet 并执行与数据库功能等效的操作,但该字段不能用于 Linq 查询中的排序。
当然,我仍然可以获得一个无序列表,然后使用确实使用该字段的额外代码重新排序此列表,但我想知道是否有一种“更清洁”的方式来做同样的事情。
【问题讨论】:
标签: .net sql-server entity-framework linq tree