Линк поисковая база данных с учетом дубликатов - PullRequest
0 голосов
/ 19 ноября 2018

У меня проблема с поиском в базе данных по повторяющимся значениям списка.

Сначала я ищу все вхождения по заданной строке.

var parentIdList =  await _context.ECATEGORIES
            .Where(a => a.NAME.ToLower().Contains(partOfName.ToLower()))
            .ToListAsync(ct);

, затем

Я получаювсе имена, когда данный PARENTID для parentIdList равен идентификатору базы данных

 var mainName = await _context.ECATEGORIES
                .Where(a=> parentIdList.Any(p=>p.PARENTID==a.ID) )
                .Select(s => s.NAME)
                .ToListAsync(ct);

Моя проблема в том, что иногда свойство PARENTID дублируется.

Например, PARENTID = {1,1,2,2,4, 5,6}

тогда результатом будет mainName = {"a", "b", "c", "d", "e"}

Но я хочу mainName = {"a "," a "," b "," b "," c "," d "," e "}

1 Ответ

0 голосов
/ 19 ноября 2018

Итак, у вас есть последовательность 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...