Разбор результата из базы данных LINQ - PullRequest
0 голосов
/ 12 марта 2019

У меня следующий запрос LINQ:

var query = (from c in _context.MapTextToLanguage
             where c.LanguageId == defaultLanguage
             where (c.Identifier == "home" || c.Identifier == "CV" || 
             c.Identifier == "contact" || c.Identifier == "manage" || 
             c.Identifier == "register" || c.Identifier == "login" || 
             c.Identifier == "logout" || c.Identifier == "about")
             select c.Text);

Это возвращает то, что я ищу, но порядок этого списка определяется тем, в каком порядке он находит объект в базе данных.

Хотелось бы, чтобы результат запроса можно было проанализировать в модели или чтобы этот запрос [0] всегда был = home.

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

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Требование: хотелось бы, чтобы результат запроса мог быть проанализирован в модели или этот запрос [0] всегда равен = home.

Как уже говорили другие, вы могли бы использовать OrderBy или ToDictionary, чтобы поставить «домашние» предметы первыми. Тем не менее, это будет перечислять вашу последовательность более одного раза. Особенно OrderBy будет сравнивать элементы несколько раз, прежде чем обнаружит, что они равны в Order.

Но зачем сравнивать все эти элементы, если вы заинтересованы только в том, чтобы сначала поставить один элемент с надписью "Домой"?

Подумайте о создании функции расширения для вашего класса, которая будет делать то, что вы хотите, перечисляя ровно один раз. См. Демистифицированные методы расширения

static IEnumerable<string>PutWordFirst(this IEnumerable<string> source, string word)
{
     List<string> nonWords = new List<string>();
     foreach(var text in source)
     {
         if (text == word)
         {
            yield return word;
         }
         else
         {
            nonWords.Add(text);
         }
    }

    foreach (var nonWord in nonWords) yield return nonWord;
 }

Использование:

var query = query = context.MapTextToLanguages
    .Where(language => ...)
    .Select(language => ...)
    .PutWordFirst("home");

Если вы хотите этот универсальный: функция, которая помещает элементы с определенным свойством в первую очередь:

static IEnumerable<TSource> WhereItemFirst<TSource, TKey>(this IEnumerable<TSource> source,
       Func<TSource, TKey> keySelector,
       TKey keyValue,
       IEqualityComparer<TKey> keyComparer)
{
    // TODO: exception if source, keySelector, keyValue null

    // if keyComparer null, use default comparer to compare TKeys
    if (keyComparer == null) keyComparer = EqualityComparer<TKey>.Default;

    List<TSource> nonKeyItems = new List<TSource>();
    foreach(var item in source)
    {
        if (comparer.Equals(keySelector(item), keyValue))
        {
            // return the item with a value equal to keyValue
            yield return item;
        }
        else
        {
            nonKeyItems.Add(item);
        }
    }

    // return the nonKey items:
    foreach (var nonKeyItem in nonKeyItems) yield return nonKeyItem;
 }

И версия без компаратора:

static IEnumerable<TSource> WhereItemFirst<TSource, TKey>(this IEnumerable<TSource> source,
       Func<TSource, TKey> keySelector, TKey keyValue)
{
    // call the function above with null comparer, uses the default comparer
    return source.WhereItemFirst(keySelector, keyValue, null);
}

Использование: сначала укажите людей, которые живут по моему адресу:

var myAddress = GetMyAddress();
var persons = GetPersons();
var myFamilyFirst = persons.WhereItemFirst(person => person.Address, myAddress);

Параметр keySelector извлекает из каждого человека его Address. Извлеченный Address сравнивается с myAddress. Если он совпадает, он возвращается первым.

1 голос
/ 12 марта 2019

Вы можете использовать:

var output = query.OrderByDescending(x => x == "home");

, чтобы сделать вывод [0], вернуть текст домашнего идентификатора, альтернативно:

//adjust your query to select c rather than c.Text
var output = query.ToDictionary(x => x.Identifier);

, чтобы вы могли сделать вывод ["home"] .Текст, вывод [" CV "]. Текст и т. Д.

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