Итак, у вас есть последовательность Categories
, где каждый Category
имеет Id
, ParentId
и Name
. У вас также есть строка partOfName
Вы хотите Names
из Categories
. Все Categories
? Нет. Только те Categories
, у которых есть Parent, имя которого выглядит как partOfName
( выглядит как , представлено использованием функции , которая содержит в вашем коде)
Я не уверен, используете ли вы сущность. Ваше использование _context
кажется намеком на это. В этом случае было бы проще использовать виртуальные родительские свойства. Смотрите позже.
Если вы не используете каркас сущностей, я бы посоветовал получить ваши данные в одном запросе: объединить элементы с их родителями и сохранить только результаты объединения, если родительский элемент соответствует вашему предикату contains
:
string lowerCasePartOfName = partOfName.ToLower(); // for efficiency: do this only once
IQueryable<Category> categories = myDbContext.Categories;
IQueryable<Category> validParents = myDbContext.Categories
.Where(category => category.Name.ToLower().Contains(lowerCasePartOfName))
Теперь объедините каждую категорию с validParentIds в Category.ParentId = Parent.Id
var query = Categories.Join(validParents, // join categories with validParents
category => category.ParentId, // from each category take the ParentId
parent => parent.Id, // from each valid parent take the Id
(category, parent) => new // when they match make one new object
{
CategoryName = category.Name,
});
Обратите внимание, что до сих пор запрос не был выполнен, он еще не был выполнен. Если вы хотите, вы можете объединить их в один большой запрос LINQ. Я не уверен, что это сильно увеличит производительность; однако это уменьшит читабельность.
var result = query.ToListAsync();
Entity Framework Solution
Если вы используете каркас сущностей, ваш класс Category будет выглядеть так:
class Category
{
public int Id {get; set;}
public string Name {get; set;}
// every Category has zero or one Parent category:
public int? ParentId {get; set;}
public Category Parent {get; set;}
// every Category has zero or more Children, each of them has this Category as Parent
public virtual ICollection<Category> Children {get; set;}
}
Ваш запрос будет намного проще:
Дайте мне все имена категорий, чьи родители имеют имя, которое выглядит как partOfName
string lowerCasePartOfName = partOfName.ToLower();
var result = myDbContext.Categories
// keep only the Categories whose name looks like:
.Where(category => category.Parent.Name.ToLower().Contains(lowerCasePartOfName))
.Select(category => category.Name);