Linq заявка за получаване на идентификатор на родител, идентификатор на баба и дядо и т.н. до основния идентификатор

Имам следния клас

public class Category
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
public virtual int? ParentID { get; set; }  
public virtual IList<Category> Children { get; set; }
}

Картографирам таблица на база данни със самореферираща връзка с външен ключ с полета id, име и родителски id към този клас, използвайки Nhibernate (въпреки че това може да е рамката на обекта, orm всъщност няма значение).

Като се има предвид всяка категория, имам нужда от метод/заявка, която ми дава категория parentid, grandparentid и т.н. Мисля, че един от начините да го направя е да използвам метод, който работи рекурсивно, извличайки последователни parentid и спирайки, когато удари нулев parentid. Най-доброто, което съм измислил досега, е да направя нещо подобно на

 newcategory = Load<Category>(category.parentId)
 add newcategoryid to list
 category = newcategory
 repeat until category.parentid is null

Но се чудех дали може да има проблеми с производителността с нещо подобно, тъй като може да включва многобройни пътувания до базата данни.


person Dave Barnett    schedule 16.12.2014    source източник


Отговори (1)


Entity framework вероятно ще се затрудни с това, както споменахте. Можете да заредите всичко в паметта за тази таблица и след това да използвате LINQ за рекурсия нагоре по йерархията.

var categories = from c in category
                 select c;
//ToList executes the SQL statement once
var catList = categories.ToList()
//recurse over in-memory list

Или можете да създадете SQL съхранена процедура и просто да я извикате с EF.

person Scott Murphy    schedule 16.12.2014
comment
Благодаря, това ми звучи като добра идея! Ще подобри ли производителността, ако кеширате заявката за linq. Или това е лоша идея? - person Dave Barnett; 17.12.2014
comment
Зависи от това с колко данни работите и устойчивостта на грешки - колко често се актуализират данните? Можете ли да кеширате за един час и да пропуснете някои актуализации или ще трябва да актуализирате кеша всяка минута? - person Scott Murphy; 17.12.2014
comment
В момента това е малко количество данни - 20 записа, но ще расте, но никога няма да бъде повече от 500 записа. Данните се актуализират много рядко, така че кеширането на всеки час би било добре. - person Dave Barnett; 17.12.2014
comment
В такъв случай кеширането звучи като правилния начин! - person Scott Murphy; 17.12.2014