Как искать контекст, используя список строк и заказать его? - PullRequest
0 голосов
/ 13 октября 2019

У меня есть массив строк, которые нужно искать в контексте.

List<string> nameList

и у меня есть контекст для поиска по

context.Name

У меня есть мой код здесь:

            List<Guid> nameIds= context.Name
                .Where(n => nameList.Contains(n.Description)
                .Select(n=> n.NameId)
                .ToList();

Я могу получить идентификатор своих имен, но я хочу, чтобы он был упорядочен по nameList, а не по самому контексту.

Например. Имена в моей базе данных - [Бен, Мария, Лиза] с [0, 1, 2] id соответственно. А мой nameList - это [Лиза, Мария] в порядке. nameIds будет [1,2], потому что оно упорядочено контекстом. Я хочу, чтобы это было заказано nameList;[2,1]

Ответы [ 3 ]

1 голос
/ 13 октября 2019

Вы можете сделать заказ на основе порядка элементов nameList с помощью операций Linq Join и OrderBy. Результат приведенных ниже операторов имеет коллекцию NameId на основе порядка элементов nameList.

List<Guid> nameIds = context.Name.Where(n => nameList.Contains(n.Description)).ToList()
                          .Join(nameList, n => n.Description, l => l, (n, l) => new {n.NameId, l})
                         .OrderBy(o => o.l)
                         .Select(s => s.NameId).ToList();

Если вы заметили выше:

  • Я оставил Where with Contains запрос не поврежден, чтобы убедиться, что только отфильтрованные данные возвращаются из базы данных. Если вы удалите это предложение и сделаете прямое соединение, этот полный набор данных будет возвращен из БД, что может вызвать проблему performance в вашем приложении.
  • При возврате IQueryable, ToList выполнить запрос для извлечения данных из базы данных
  • Join операция объединяет данные БД и nameList
  • OrderBy упорядочивает данные на основе описания (фактический порядок nameList items)
  • Select выбирает NameId

Created this dotnetfiddle для демонстрации работы всего оператора linq.

1 голос
/ 14 октября 2019

Вы хотите, чтобы результат сохранял порядок данных поиска.
Таким образом, нет порядка, просто присоединение к ним должно работать для вас.

Вот пример для вас

class Program
{
    static void Main(string[] args)
    {
        // searched data from db
        List<Person> people = new List<Person> { new Person(0, "Ben"), new Person(1, "Maria"), new Person(2, "Liza") };
        // search data
        List<string> nameList = new List<string> { "Liza", "Maria" };

        var result = nameList.Join(people, n => n, p => p.Name, (n, p) => p.Id).ToList();
    }
}

class Person
{
    public Person(int id, string name)
    {
        Id = id;
        Name = name;
    }
    public int Id { get; set; }
    public string Name { get; set; }
}
1 голос
/ 13 октября 2019

Попробуйте лямбда-выражение OrderByDescending <>:

void GetOrderedData()
{
    IEnumerable<MyObject> data = Enumerable.Range(1, 20).Select(x => new MyObject
    {
        id = x,
        name = "Name " + x
    });

    var ordereddata = data.Where(x => x.id > 6 && x.id < 14).OrderByDescending(x => x.id).Select(x => x.name);
}

public class MyObject
{
    public int id { get; set; }
    public string name { get; set; }
}

До и после фильтрации + упорядоченные данные:

enter image description here

StackOverFlowarticle: Order по убыванию в лямбда-выражении?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...