2

更新 这是我与@Slauma讨论过的来自波纹管的评论:

因为我需要获取连接到传递的根类别的所有位置。如您所见,如果我通过 2 并且某个位置的类别为 44,而 44 是 32 的子级,即 2 的子级,我需要获取此位置。LocationCategory 是 Locations 和 PlaceCategories 之间的数据库中的 N:N 表。不重要,但可以提供更好的图片。我有一张地图和那张地图上的标记。我可以点击 Education(id:2) 链接,我需要获取位置类别根为“2”的所有标记(如foursquare.com地图上)

我在数据库中有一个自引用表。所以我创建了以下对象:

public class PlaceCategory
    {
        public int PlaceCategoryId { get; set; }
        public string Name{ get; set; }
        public int? ParentId { get; set; }

        public virtual PlaceCategory Parent { get; set; }
        public virtual ICollection<PlaceCategory> Children { get; set; }

        public string Icon { get; set; }
    }

因为 Location 对象可以有多个类别,所以我有 LocationCategory 对象:

public class LocationCategory
    {
        [Key, Column(Order = 1)]
        public int LocationId { get; set; }
        [Key, Column(Order = 2)]
        public int PlaceCategoryId { get; set; }
        public Guid UserId { get; set; }
        public DateTime CreatedOnDate { get; set; }
        public bool IsPrimary { get; set; }

        public virtual Location Location { get; set; }
        public virtual PlaceCategory PlaceCategory { get; set; }
        public virtual User User { get; set; }
    }

位置对象有:

public class Location
{
    ...
    public virtual ICollection<LocationCategory> LocationCategories { get; set; } 
    ...

在自我参考表的数据库中,我有:

root: Education (id:2, parentId:null)
child1: School(id:32, parentId:2) 
child2: Elementary(id:42,parentId:32), High(id:43,parentId:32), Higher(id:44,parentId:32) etc.

我必须根据传递的根类别获取位置列表。

var model = locationRepository.GetLocationss().Where(x => x.LocationCategories???); // but it's a list and don't know how to check top most parent here?

所以如果我通过'2',我应该得到所有类别为 2、32、42、43、44 的项目

4

1 回答 1

3

实体框架不支持这一点,除非您在检索位置时添加rootCategoryId到每个PlaceCategory属性并过滤该属性,但是一旦您有更深的嵌套,这种方法将失败,您可能需要获取某个非根类别的所有位置(但有自己的父母)。在这种情况下,存储根将无济于事。

这个问题的概括称为分层或递归查询。那就是可以遍历层次结构并获取所有需要的嵌套记录的查询。可以通过使用通用表表达式别名 CTE(需要 SQL Server 2005 或更高版本)来使用 SQL 执行此操作。您可以创建这样的查询并直接执行它dbContext.Database.SqlQuery

在 EF 5.0 与 .NET 4.5 和 EDMX(数据库优先)的情况下,您还可以在 SQL Server 中将查询实现为表值函数,将其映射到 EDMX 并在 Linq 查询中使用它。

于 2012-09-16T19:09:54.737 回答