powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Помогите изменить запрос так, чтобы отказаться от слияния словарей
40 сообщений из 40, показаны все 2 страниц
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38408368
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ниже представлен набор сущностей и запросы к ним через EF.

В запросе используется уже известный экземпляр weed типа Weed. Я хочу получить список всех UseRecommendation для известного экземпляра Weed.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
foreach (var wg in weed.WeedGroups)
{
  ndb.UseRecommendations
      .Where(ur => ur.WeedGroups.Contains(wg))
      .ToDictionary(
          ur => ur.Preparation.Name,
          ur => new UseRecommendationModel()
          {
              PreparationName = ur.Preparation.Name,
              ...
          });
}



Надо все результаты на каждой итерации получить в виде одного словаря, причём со значениями, упорядоченными по ключу.

Т. к. на каждой итерации у меня получается по словарю, то для получения одного словаря их надо слить. Слить - муторно. Как переписать так, чтобы в один запрос прошло всё? Что-то мне подсказывается, что надо использовать ForEach метод списка, но не уверен.
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38408455
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Как переписать так, чтобы в один запрос прошло всё?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
var recommendations = new Dictionary<String, UseRecommendationModel>();

foreach (var wg in weed.WeedGroups)
{
    var collection = ndb.UseRecommendations.Where(ur => ur.WeedGroups.Contains(wg));

    foreach (var recommendation in collection)
    {
        string preparationName = recommendation.Preparation.Name;

        recommendations.Add(preparationName, new UseRecommendationModel { PreparationName = preparationName, ... });
    }
}
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38408496
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А это точно в один запрос к БД превратится?

И как упорядочить таки по ключу?
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38408517
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320А это точно в один запрос к БД превратится?
user7320В запросе используется уже известный экземпляр weed типа Weed. Я хочу получить список всех UseRecommendation для известного экземпляра Weed.А, Вы хотите один запрос к БД для одного экземпляра weed?
user7320И как упорядочить таки по ключу? SortedDictionary<TKey, TValue> Class
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38408545
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
var recommendations = new SortedDictionary<String, UseRecommendationModel>();
var collection = ndb.UseRecommendations.Where(ur => ur.WeedGroups.Any(wg => weed.WeedGroups.Contains(wg)));

foreach (var recommendation in collection)
{
    string preparationName = recommendation.Preparation.Name;

    recommendations.Add(preparationName, new UseRecommendationModel { PreparationName = preparationName, ... });
}


или
Код: c#
1.
2.
3.
4.
ndb.UseRecommendations
   .Where(ur => ur.WeedGroups.Any(wg => weed.WeedGroups.Contains(wg)))
   .OrderBy(ur => ur.Preparation.Name)
   .ToDictionary(ur => ur.Preparation.Name, ur => new UseRecommendationModel { PreparationName = ur.Preparation.Name, ... });
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38408642
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
Код: c#
1.
2.
3.
4.
ndb.UseRecommendations
   .Where(ur => ur.WeedGroups.Any(wg => weed.WeedGroups.Contains(wg)))
   .OrderBy(ur => ur.Preparation.Name)
   .ToDictionary(ur => ur.Preparation.Name, ur => new UseRecommendationModel { PreparationName = ur.Preparation.Name, ... });


Спасибо, это как раз то, что я хотел.


А если я хочу это запихнуть в словарь только для чтения:

Код: c#
1.
2.
3.
4.
IReadOnlyDictionary<string, UseRecommendationModel> Suppressions = 
    new ReadOnlyDictionary<string, UseRecommendationModel>(
        new SortedDictionary<string, UseRecommendationModel>(
            ...



и потом по итоговой коллекции Suppressions пройтись foreach'ем, то порядок сохранится?


И ещё. Первый ваш пример кода здесь явно не подходит, т. к. при добавлении элемента к сортированному словарю порядок не сохраняется. Наверное, больше подошёл бы OrderedDictionary? Хотя он и не дженерик, но потом ведь можно из Object (тип для его ключей и значений) привести значения к нужному типу?
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38408657
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА если я хочу это запихнуть в словарь только для чтения:

IReadOnlyDictionary<string, UseRecommendationModel> Suppressions =
new ReadOnlyDictionary<string, UseRecommendationModel>(
new SortedDictionary<string, UseRecommendationModel>(
...


и потом по итоговой коллекции Suppressions пройтись foreach'ем, то порядок сохранится?
Не, я понимаю, что можно проверить на простых данных. Но будет ли он это делать ВСЕГДА? Может, на всяких 1,2,3,4 и прочих а,б,с он хеши тоже упорядоченные генерит.

Или это плохой способ суммирования функциональностей - оборачивание каждый раз в класс, который содержит нужную функциональность?
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38408664
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Первый ваш пример кода здесь явно не подходит, т. к. при добавлении элемента к сортированному словарю порядок не сохраняется.Не понял, Вы же хотели упорядочить по ключу?
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38408666
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для на фига Вам ReadOnlyDictionary ?
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38408678
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAДля на фига Вам ReadOnlyDictionary ?
Ну, это поле модели. И я хочу пользователю модели явно показать, что изменять коллекцию не нужно. А чего в этом плохого-то?

skyANAuser7320Первый ваш пример кода здесь явно не подходит, т. к. при добавлении элемента к сортированному словарю порядок не сохраняется.Не понял, Вы же хотели упорядочить по ключу?
Да не, всё нормально, вы мне помогли, как я хотел. Просто, я тут вычитал на StackOverflow, что SortedDictionary не сохраняет порядок новых добавленных элементов. Т. е., если хочешь сортированный словарь, то ему надо сразу сортированные данные скармливать. Вот у вас в первом примере данные последовательно добавляются, а во втором - сразу скармливаются сортированные. Поэтому я и говорю, что использование SortedDictionary с последовательным добавлением данных вроде как бессмысленно - они всё равно будут не sorted, то зачем именно SortedDictionary?

Ну это так, в качестве размышлений я.
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38408691
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторnew ReadOnlyDictionaryuser7320,
он же уже реализует IReadOnlyDictionary
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38408710
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиавторnew ReadOnlyDictionaryuser7320,
он же уже реализует IReadOnlyDictionary
Ну да. Ну и что, что интерфейс? Я тут насмотрелся примеров кода у всяких джошей смитов - там почему-то если коллекцию какую-то хотят присвоить, то поле класса объявляют как ICollection или ещё через какой интерфейс. Я раньше тоже объявлял сразу через конкретные реализации, а потом решил, что стоит передрать у крутанов. Для себя объяснил это, что так будет проще переопределять эти поля, т. к. их можно заменить любой конкретной реализацией, а не только какой-нибудь одной.

На самом деле Suppressions - поле класса. Это я просто для простоты тут написал, что это типа переменная.
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38408720
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320skyANAДля на фига Вам ReadOnlyDictionary ?
Ну, это поле модели. И я хочу пользователю модели явно показать, что изменять коллекцию не нужно. А чего в этом плохого-то?Бррр. Насколько я помню пользователь модели у Вас - это представление. Кто-то параллельно с Вами пишет код представления и способен там какую-то логику нафигачить?

А чтобы понять плохо это, или нет, надо на всю модель посмотреть. Вообще есть такое понятие как инкапсуляция, и я что-то сомневаюсь, что Вам вообще нужно Dictionary наружу из модели выставлять.

user7320skyANAпропущено...
Не понял, Вы же хотели упорядочить по ключу?
Да не, всё нормально, вы мне помогли, как я хотел. Просто, я тут вычитал на StackOverflow, что SortedDictionary не сохраняет порядок новых добавленных элементов. Т. е., если хочешь сортированный словарь, то ему надо сразу сортированные данные скармливать. Вот у вас в первом примере данные последовательно добавляются, а во втором - сразу скармливаются сортированные. Поэтому я и говорю, что использование SortedDictionary с последовательным добавлением данных вроде как бессмысленно - они всё равно будут не sorted, то зачем именно SortedDictionary?

Ну это так, в качестве размышлений я.Вы бы взяли лучше пример по ссылке на MSDN, что я приводил и посмотрели, вместо того, чтобы всякую фигню читать и размышлять о ней. Глядишь и время на создания (генерации посредством scaffolding) репозитория появилось.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
using System;
using System.Collections.Generic;

namespace SortedDictionaryApplication
{
    class Program
    {
        static void Main()
        {
            // Create a new sorted dictionary of strings, with string 
            // keys.
            var openWith = new SortedDictionary<string, string>();

            // Add some elements to the dictionary. There are no  
            // duplicate keys, but some of the values are duplicates.
            openWith.Add("txt", "notepad.exe");
            openWith.Add("bmp", "paint.exe");
            openWith.Add("dib", "paint.exe");
            openWith.Add("rtf", "wordpad.exe");

            foreach (KeyValuePair<string, string> pair in openWith)
            {
                Console.WriteLine("Key: {0}, Value: {1}", pair.Key, pair.Value);
            }

            Console.ReadKey();
        }
    }
}
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38408741
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320И я хочу пользователю модели явно показать, что изменять коллекцию не нужно.
Ну изменить он коллекцию и что дальше? Или перельёт данные в другую коллекцию и там изменит, в чем проблема. Это же не thread safe реализация, где n-потоков творят не пойми чего со статическим экземпляром. Какая-то истерия по поводу read only...
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38408765
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,
он наверное ( если это словари) закешировать хочет с укропчиком и чесночком, что бы другие пользователи в базу не лазили ))
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38408947
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторБррр. Насколько я помню пользователь модели у Вас - это представление. Кто-то параллельно с Вами пишет код представления и способен там какую-то логику нафигачить?
Да. Как это называется... "защитное программирование", чтоли.

авторВообще есть такое понятие как инкапсуляция, и я что-то сомневаюсь, что Вам вообще нужно Dictionary наружу из модели выставлять.
Этот словарь отдаётся через свойство. По свойству надо пройтись (форичем) в представлении и вытащить из него все данные. Выбрал словарь, чтобы не лепить новую сущность, типа Пара<ключ, значение>. Можно было и какой-нибудь List<KeyValuePair<, >>, но зачем - есть же словари? А так, в представлении нужно выводить как ключи, так и значения.

авторВы бы взяли лучше пример по ссылке на MSDN, что я приводил и посмотрели, вместо того, чтобы всякую фигню читать и размышлять о ней.
Да, точно. Он сортирует. Я перепутал с OrderedDictionary, который сохраняет порядок добавления элементов.

МСУuser7320И я хочу пользователю модели явно показать, что изменять коллекцию не нужно.
Ну изменить он коллекцию и что дальше? Или перельёт данные в другую коллекцию и там изменит, в чем проблема. Это же не thread safe реализация, где n-потоков творят не пойми чего со статическим экземпляром. Какая-то истерия по поводу read only...
Это уже называется "бороться со фреймворком". Ну, в смысле, с моделями, которые я ему даю. Если явно перельёт данные - то это уже не моя проблема и я за это не отвечаю. Я ему данные дал в готовом виде, которые надо только считать.

А что плохого в ридонли?
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38408948
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА что плохого в ридонли?
Я ещё и private set; иногда добавляю. ))
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38409122
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320авторБррр. Насколько я помню пользователь модели у Вас - это представление. Кто-то параллельно с Вами пишет код представления и способен там какую-то логику нафигачить?
Да. Как это называется... "защитное программирование", чтоли.

авторВообще есть такое понятие как инкапсуляция, и я что-то сомневаюсь, что Вам вообще нужно Dictionary наружу из модели выставлять.
Этот словарь отдаётся через свойство. По свойству надо пройтись (форичем) в представлении и вытащить из него все данные. Выбрал словарь, чтобы не лепить новую сущность, типа Пара<ключ, значение>. Можно было и какой-нибудь List<KeyValuePair<, >>, но зачем - есть же словари? А так, в представлении нужно выводить как ключи, так и значения.

авторВы бы взяли лучше пример по ссылке на MSDN, что я приводил и посмотрели, вместо того, чтобы всякую фигню читать и размышлять о ней.
Да, точно. Он сортирует. Я перепутал с OrderedDictionary, который сохраняет порядок добавления элементов.

МСУпропущено...

Ну изменить он коллекцию и что дальше? Или перельёт данные в другую коллекцию и там изменит, в чем проблема. Это же не thread safe реализация, где n-потоков творят не пойми чего со статическим экземпляром. Какая-то истерия по поводу read only...
Это уже называется "бороться со фреймворком". Ну, в смысле, с моделями, которые я ему даю. Если явно перельёт данные - то это уже не моя проблема и я за это не отвечаю. Я ему данные дал в готовом виде, которые надо только считать .

А что плохого в ридонли?
Хм...
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class ViewModel
{
    public IEnumerable<UseRecommendationModel> Suppressions { get; private set; }
}

// Код, что форичем читает данные, причём и ключ, и значение
foreach (UseRecommendationModel value in model.Suppressions)
{
    string key = value.PreparationName;
}


Ну и зачем ридонли словарь?
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38409572
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class ViewModel
{
    public IEnumerable<UseRecommendationModel> Suppressions { get; private set; }
}

// Код, что форичем читает данные, причём и ключ, и значение
foreach (UseRecommendationModel value in model.Suppressions)
{
    string key = value.PreparationName;
}


Ну и зачем ридонли словарь?
Ридонли словарь - нельзя менять данные в одном и том же словаре. Приватное свойство типа словарь - нельзя назначить новый словарь этому свойству.
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38409574
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, кстати, забыл приватные сеты сделать у себя в моделях. Щас поправлю.
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38409612
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320skyANA
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class ViewModel
{
    public IEnumerable<UseRecommendationModel> Suppressions { get; private set; }
}

// Код, что форичем читает данные, причём и ключ, и значение
foreach (UseRecommendationModel value in model.Suppressions)
{
    string key = value.PreparationName;
}


Ну и зачем ридонли словарь?
Ридонли словарь - нельзя менять данные в одном и том же словаре. Приватное свойство типа словарь - нельзя назначить новый словарь этому свойству.Выше кусок кода видишь? Там тоже этого нельзя. Зачем лишние телодвижения и лишняя память?
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38409733
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320нельзя менять данные в одном и том же словаре.
А твоя модель будет уметь реагировать на сетевые скачки напряжения?
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38409814
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAuser7320пропущено...

Ридонли словарь - нельзя менять данные в одном и том же словаре. Приватное свойство типа словарь - нельзя назначить новый словарь этому свойству.Выше кусок кода видишь? Там тоже этого нельзя. Зачем лишние телодвижения и лишняя память?
Ну, если порядок сохраняется без сортированных списков и словарей (достаточно отсортировать в запросе), то я могу ещё согласиться убрать словари и вообще сортированные коллекции. Но тогда сделать ReadOnlyCollection:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
IReadOnlyCollection<UseRecommendationModel> Suppressions =
  new ReadOnlyCollection(
    ndb.UseRecommendations
       .Where(ur => ur.WeedGroups.Any(wg => weed.WeedGroups.Contains(wg)))
       .OrderBy(ur => ur.Preparation.Name)
       .Select(ur => new UseRecommendationModel()
       {
          PreparationName = ur.Preparation.Name, 
          ... 
       })
       .ToList());



Почему я это делаю? Ну, типа, я параноик . Как бы, такой тип, который явно говорит о себе "я только для чтения", должен предостеречь пользователя от попыток изменить его данные. Конечно, если пользователь захочет, он может сделать себе копию этих данных в изменяемую коллекцию и менять их сколько хочет. Но тогда я уже как бы за это не отвечаю. Нормальное объяснение?
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38409816
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУuser7320нельзя менять данные в одном и том же словаре.
А твоя модель будет уметь реагировать на сетевые скачки напряжения?
У меня модель присоединена к ИБП и ещё аварийка в подвал идёт, где сидит ТЛП и готов всегда начать крутить педали. ))
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38409828
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
IReadOnlyCollection<UseRecommendationModel> Suppressions =
  new ReadOnlyCollection(
    ndb.UseRecommendations
       .Where(ur => ur.WeedGroups.Any(wg => weed.WeedGroups.Contains(wg)))
       .OrderBy(ur => ur.Preparation.Name)
       .Select(ur => new UseRecommendationModel()
       {
          PreparationName = ur.Preparation.Name, 
          ... 
       })
       .ToList());


Как бы, такой тип, который явно говорит о себе "я только для чтения", должен предостеречь пользователя от попыток изменить его данные. Конечно, если пользователь захочет, он может сделать себе копию этих данных в изменяемую коллекцию и менять их сколько хочет. Но тогда я уже как бы за это не отвечаю. Нормальное объяснение?
Правда, наверное, .ToList() в конце будет лишний. Когда в модели представления форичем начнут проходить, тогда коллекцию и материализуют. Зачем делать это заранее, да? Это как раз то, про что Где-то в степи говорил, что любит "ленивое исполнение", да?
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38410034
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Почему я это делаю? Ну, типа, я параноик . Как бы, такой тип, который явно говорит о себе "я только для чтения", должен предостеречь пользователя от попыток изменить его данные. Конечно, если пользователь захочет, он может сделать себе копию этих данных в изменяемую коллекцию и менять их сколько хочет. Но тогда я уже как бы за это не отвечаю. Нормальное объяснение?Вот ты отжигаешь.

А IEnumerable о чём говорит пользователю?
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38410045
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Это как раз то, про что Где-то в степи говорил, что любит "ленивое исполнение", да?Он про инициализацию говорил, а не про то, что ты сейчас придумал.
Что такое инициализация, тебе понятно?
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38410077
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAuser7320Почему я это делаю? Ну, типа, я параноик . Как бы, такой тип, который явно говорит о себе "я только для чтения", должен предостеречь пользователя от попыток изменить его данные. Конечно, если пользователь захочет, он может сделать себе копию этих данных в изменяемую коллекцию и менять их сколько хочет. Но тогда я уже как бы за это не отвечаю. Нормальное объяснение?Вот ты отжигаешь.

А IEnumerable о чём говорит пользователю?
Что это коллекция для перечисления. Но вдруг он такой же, как я был вчера? Вот я ему и помогу.

А где тогда использовать IReadOnlyCollection, если его везде может заменить IEnumerable?

skyANAuser7320Это как раз то, про что Где-то в степи говорил, что любит "ленивое исполнение", да?Он про инициализацию говорил, а не про то, что ты сейчас придумал.
Что такое инициализация, тебе понятно?
У меня этот код в конструкторе модели (ASP.NET MVC), и там происходит инициализация свойства Suppressions. А чтобы контекст БД, ска, не сдох, я его создам в контроллере и передам в конструктор модели, во. Надеюсь, он (контекст) доживёт до представления. Если не доживёт, то придётся ToList() в конструкторе писать... Эмм... Тогда мне непонятно, как сделать ленивую инициализацию без опасения, что контекст БД будет собран мусорщиком...
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38429339
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320skyANA
Код: c#
1.
2.
3.
4.
ndb.UseRecommendations
   .Where(ur => ur.WeedGroups.Any(wg => weed.WeedGroups.Contains(wg)))
   .OrderBy(ur => ur.Preparation.Name)
   .ToDictionary(ur => ur.Preparation.Name, ur => new UseRecommendationModel { PreparationName = ur.Preparation.Name, ... });


Спасибо, это как раз то, что я хотел.[/src]

Ещё, запрос я немного изменил, но суть его та же:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Weed weed = db.Weeds.First(w => w.Id == id);

this.Suppressions =
    db.UseRecommendations
    .Where(ur =>
        ur.WeedGroups
        .Any(urwg =>
            weed.WeedGroups
            .Contains(urwg)))
    .OrderBy(ur => ur.Preparation.Name)
    .Select(ur => new UseRecommendationModel()
    {
            ...
    })
    .ToList()
    .AsReadOnly();



У меня этот код выдал исключение "Unable to create a constant value of type 'CropsProtectionDBLibrary.WeedGroup'. Only primitive types or enumeration types are supported in this context."

Вобщем, я посмотрел, и вроде как проблема в том, что EF не может в запросе использовать объект WeedGroup и надо избавиться от вызова конструктора. Вроде, советуют использовать не полные объекты в методах типа Contains, Any и т. п., а только их айдишники (т. е. примитивные типы, о которых и говорится в исключении). Я переделал так (добавил селекты с выбором айдишников), но всё равно та же ошибка:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
this.Suppressions =
    db.UseRecommendations
    .Where(ur =>
        ur.WeedGroups
        .Select(urwg => urwg.Id)
        .Any(urwgId =>
            weed.WeedGroups
            .Select(wwg => wwg.Id)
            .Contains(urwgId)))
    .OrderBy(ur => ur.Preparation.Name)
    .Select(ur => new UseRecommendationModel()
    {
            ...
    })
    .ToList()
    .AsReadOnly();



Подскажите, как исправить.
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38429362
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А это совсем невыполнимо зах-ть список id'шников в List, а потом уже его и использовать... собсно такими ответами и забит стековерфлоу...
Код: c#
1.
2.
3.
4.
5.
        .Any(urwgId =>
            weed.WeedGroups
            .Select(wwg => wwg.Id)
            .ToList()
            .Contains(urwgId)))



Можа и так прокатит... не проверял...
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38429375
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buserА это совсем невыполнимо зах-ть список id'шников в List, а потом уже его и использовать... собсно такими ответами и забит стековерфлоу...
Код: c#
1.
2.
3.
4.
5.
        .Any(urwgId =>
            weed.WeedGroups
            .Select(wwg => wwg.Id)
            .ToList()
            .Contains(urwgId)))



Можа и так прокатит... не проверял...
Не проверял, но что-то мне подсказывает, что вложенный запрос должен быть целиком в интерфейсе IQueryable, а ToList() переведёт его в IEnumerable. Щас проверю.
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38429405
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Методом исключения нашёл, что проблема в Any. Вот так исключения не возникает

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
this.Suppressions =
    db.UseRecommendations
    .Where(ur =>
        ur.WeedGroups
        .Any())
    .OrderBy(ur => ur.Preparation.Name)
    .Select(ur => new UseRecommendationModel()
    {
            ...
    })
    .ToList()
    .AsReadOnly();
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38429425
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buserА это совсем невыполнимо зах-ть список id'шников в List, а потом уже его и использовать... собсно такими ответами и забит стековерфлоу...
Код: c#
1.
2.
3.
4.
5.
        .Any(urwgId =>
            weed.WeedGroups
            .Select(wwg => wwg.Id)
            .ToList()
            .Contains(urwgId)))



Можа и так прокатит... не проверял...
Как я и сказал, LtoE не понимает всякие ToList.

Вобщем, к моему ответу выше, стоит добавить в Any какую-нибудь логику, как вылетает исключение.
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38429451
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38429459
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя... может что и поменялось ужо... года трЫ назад последний раз на это смотрел...
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38429469
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S.: вы будете преданы анафеме, возможно, кто-то из коллег, что будут сопровождать код, даже попытаются забить вас камнями... если не успеете вовремя уволиться... это я про километры линку запросов
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38429538
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, понял, в чём дело. Надо ту переменную, к которой Contains применяется, сделать примитивным типом. Иначе этот Contains по коллеции создаёт на каждый элемент коллеции экземпляр через конструктор и пытается сравнить его с объектом, который в Contains находится. Поэтому перед запросом делаю так

Код: c#
1.
var weedGroupsIds = weed.WeedGroups.Select(wg => wg.Id).ToList();



и к результату тогда уже применяю Contains().

Полностью всё выглядит так

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Weed weed = db.Weeds.First(w => w.Id == id);

var weedGroupsIds = weed.WeedGroups.Select(wg => wg.Id).ToList();

this.Suppressions =
    db.UseRecommendations
    .Where(ur =>
        ur.WeedGroups
        .Any(urwg =>
            weedGroupsIds
            .Contains(urwg.Id)))
    .OrderBy(ur => ur.Preparation.Name)
    .Select(ur => new UseRecommendationModel()
    {
        ...
    })
    .ToList()
    .AsReadOnly();




buserP.S.: вы будете преданы анафеме, возможно, кто-то из коллег, что будут сопровождать код, даже попытаются забить вас камнями... если не успеете вовремя уволиться... это я про километры линку запросов

А что, километры SQL-запросов (как говорил один мой знакомый, из Москвы присылают SQL-запрос на полстраницы А4, в котором есть ошибка - к вечеру надо отослать запрос без ошибки) - это кульно и рульно? Или коллеги не знают, где взять дебаггер-вижуалайзер-ToSQL-генератор для LtoE? С одной стороны коллеги твердят, что запросы должны быть маааленькие, и лучше много маленьких, чем один большой. С другой - нужно всё делать одним запросом, и ты мне тут своей кучей маленьких сервер не надрывай! Лучший вариант среди всего этого, по-моему - делать, как ты считаешь нужным. А другие пусть выполняют свою работу - разбирают большие запросы и оптимизируют нагрузку сервера.
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38429543
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Достаточно, что я удобно и глазу приятно форматирую эти запросы - видите, как строчки ровненько так и по лесенке сидят? Лично мне нравится.
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38429546
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Достаточно, что я удобно и глазу приятно форматирую эти запросы - видите, как строчки ровненько так и по лесенке сидят? Лично мне нравится.
Кстати, про коллегу выше - ему дают тупо одну сплошную строку на эти самые пол-А4. Когда он её в редакторе в удобный вид приведёт, всё может растянуться ещё хуже. Ну и кто тут идиот - москвичи-ламерьё, или я? И когда это кого-то стали пугать запросы в три строки с жалким одним подзапросом?
...
Рейтинг: 0 / 0
Помогите изменить запрос так, чтобы отказаться от слияния словарей
    #38429711
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320user7320Достаточно, что я удобно и глазу приятно форматирую эти запросы - видите, как строчки ровненько так и по лесенке сидят? Лично мне нравится.
Кстати, про коллегу выше - ему дают тупо одну сплошную строку на эти самые пол-А4. Когда он её в редакторе в удобный вид приведёт, всё может растянуться ещё хуже. Ну и кто тут идиот - москвичи-ламерьё, или я?Боюсь что и москвичи и ты
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Помогите изменить запрос так, чтобы отказаться от слияния словарей
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]