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が、ネストが深くなるとこのアプローチは失敗し、ルートではない(ただし独自のカテゴリを持つ)カテゴリのすべての場所を取得する必要がある場合があります親)。このような場合、ルートを保存しても効果はありません。

この問題の一般化は、階層クエリまたは再帰クエリと呼ばれます。これは、階層をトラバースして、必要なすべてのネストされたレコードを取得できるクエリです。Common Table ExpressionエイリアスCTE(SQL Server 2005以降が必要)を使用して、SQLでこれを行うことができます。このようなクエリを作成し、によって直接実行できますdbContext.Database.SqlQuery

.NET4.5およびEDMX(データベースファースト)を備えたEF 5.0の場合、SQL Serverでテーブル値関数としてクエリを実装し、EDMXでマップして、Linqクエリで使用することもできます。

于 2012-09-16T19:09:54.737 に答える