powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
24 сообщений из 74, страница 3 из 3
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38421217
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Касательно этого моего поста. Нет, всё же, требование конструкторов без параметров в линке не даёт мне воспользоваться ReadOnlyCollection. Тогда остаётся узнать, что имеется ввиду под "the type of source ".

И ещё, есть способ узнать, при вызове Count() начинается итерация по коллеции или всего лишь считывается готовое свойство? Скажем, под дебагом залезть во внутрь Enumerable>Count() можно, и посмотреть, выполнилось ли там условие (если следовать примеру skyANA)

Код: c#
1.
2.
3.
4.
if (tCollection != null)
{
    return tCollection.Count;
}



?
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38421312
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320У меня сразу несколько вопросов возникло.

1.

авторIf the type of source implements ICollection<T>, that implementation is used to obtain the count of elements. Otherwise, this method determines the count.
А можете ещё пояснить эту фразу? Конкретно, какой вложенности "type of source" имеется ввиду? Например, я получаю результат запроса в виде IQuerayble, перевожу его в List через ToList(), потом отдаю это в свойство, которое показывает IEnumerable. Пользователь свойства считывает его и применяет метод Count(). В этом случае что имеется ввиду под "type of source": IEnumerable, List, IQuerayble или что-то ещё?List

user73202.

Я так понимаю, что даже если в свойство попадает полнофункциональный List, то показывая его как IEnumerable, я обрезаю ему функциональность до банального перебора коллекции и только?Да. Это называется инкапсуляция.

user73203.

Теперь учтём сразу 1 и 2. Пользователь моего свойства не знает, что служит источником для этого свойства. И если я показываю ему IEnumerable, то использовать расширение Enumerable.Count() он не имеет права, т. к. может загрузить как не знает, поддерживает ли источник этого свойства ICollection или нет. Так? Вот теперь тут всплывает наш старый спор - почему бы не заменить экспозицию свойства как IReadOnlyCollection на как IEnumerable, как предлагал skyANA. А потому что накладных расходов всё равно нет, если я в конце запроса вызываю ToList(), зато через IReadOnlyCollection я могу пользователю моего свойства явно сказать, что свойство можно не только перебирать, но и получить у него готовое число элементов Count, не боясь лишних переборов коллеции.

Т. е. если я сам пишу свойства и сам их использую - то да, можно IEnumerable и потом для него вызывать расширитель Count(). Но в общем случае надо всегда показывать через тип возврата, что можно делать, а что нельзя. Правильно?Правильно - это изучать принципы ООП, а не выдумывать их.

Восемь принципов программирования, которые могут облегчить вам жизнь
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38421337
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Касательно этого моего поста. Нет, всё же, требование конструкторов без параметров в линке не даёт мне воспользоваться ReadOnlyCollection. Тогда остаётся узнать, что имеется ввиду под "the type of source ".Блеать! Ты каким местом документацию читаешь?

Enumerable.Count<TSource> Method (IEnumerable<TSource>)
Код: c#
1.
2.
3.
public static int Count<TSource>(
	this IEnumerable<TSource> source
)


Parameters

source - a sequence that contains elements to be counted.

Под "the type of source " имеется ввиду конкретный тип параметра source !

user7320И ещё, есть способ ... под дебагом залезть во внутрь Enumerable>Count()? How to: Debug .NET Framework Source
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38421787
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторБлеать! Ты каким местом документацию читаешь?

Код: c#
1.
2.
3.
4.
Enumerable.Count<TSource> Method (IEnumerable<TSource>)
public static int Count<TSource>(
	this IEnumerable<TSource> source
)


Ну вот мы и видим, что IEnumerable<TSource> source не поддерживает Count(), а значит, расширитель будет использовать проход по коллекции.

Но если вы скажете, что тут задействована ковариация, и компилятор может определить, что под IEnumerable<TSource> source сидит какой-нибудь ICollection, и тогда он воспользуется его свойством Count без прохода по коллеции... Или вы так не скажите?

авторПод "the type of source" имеется ввиду конкретный тип параметра source!
Т. е. таки ковариация? - Любой тип, унаследованный от IEnumerable?
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38421823
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAuser7320И ещё, есть способ ... под дебагом залезть во внутрь Enumerable>Count()? How to: Debug .NET Framework Source
Проверил - код сразу возвращает Count, а не вычисляет его. Значит, с ковариацией моя догадка была верна.
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38421958
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320skyANAпропущено...
How to: Debug .NET Framework Source
Проверил - код сразу возвращает Count, а не вычисляет его.Это ясно сразу после прочтения документации. Но тебе понадобилось потратить туеву хучу времени, чтобы убедиться. Молодец!
user7320Значит, с ковариацией моя догадка была верна.Ты толком не понял, что такое ковариация.
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38422059
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAuser7320Значит, с ковариацией моя догадка была верна.Ты толком не понял, что такое ковариация.
Почему? - Это когда можно передавать объект типа, более унаследованного, чем объявленный. У МС, правда, вводятся ещё всякие ограничения, когда это применяется для параметров или возвращаемых значений.
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38422065
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320skyANAпропущено...
Ты толком не понял, что такое ковариация.
Почему? - Это когда можно передавать объект типа, более унаследованного, чем объявленный.Нет, это не правильное определение. Ты его сам придумал? А что такое полиморфизм в твоём понимании?
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38422079
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAuser7320пропущено...

Почему? - Это когда можно передавать объект типа, более унаследованного, чем объявленный.Нет, это не правильное определение. Ты его сам придумал? А что такое полиморфизм в твоём понимании?
Ладно, преположим, что я не знаю, что такое ковариация и прочие такие штуки. Но вопрос-то (первый абцаз в моём комментарии) остаётся! Т. е. расширитель будет использовать проход по коллеции. А он на деле не использует! Как же так?
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38422232
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320, ты завязывай траву-то курить.
Тебе уже и ссылку на документацию дали, и код метода расширения, и ты убедился в том, что он работает так, как написан. А всё равно не врубаешься.
Высохли походу мозги-то
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38422282
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAuser7320, ты завязывай траву-то курить.
Тебе уже и ссылку на документацию дали, и код метода расширения, и ты убедился в том, что он работает так, как написан. А всё равно не врубаешься.
Высохли походу мозги-то
Ладно, будем отталкиваться от этого поста . Вы, конечно, прямо не говорите, но я так понимаю, что согласны, что компилятор знает, какой конкретный тип сидит под IEnumerable во время выполнения, реализует ли этот тип ICollection и в результате применяет или не применяет уже заполненное свойство Count при вызове расширяющего метода Count(). Но пользователь-то, который считывает моё свойство IEnumerable, не знает всего этого! Как же тут тогда быть? Это же, как её, инкабсумляция, мать её! Как:

1) дать ему возможность перебрать свойство this.Groups;

2) дать ему возможность считать (не вычислить перебором!) число элементов коллекции этого свойства;

3) не дать ему возможности добавлять и изменять элементы в коллеции явно (т. е. обойтись без всяких ICollection; если будет копировать коллецию в другую, где сможет менять всё, что захочет - его проблемы);

4) не показывать ему код модели (т. е. он не знает, что там сидит под IEnumerable или какое я свойство ему выставлю) - т. е. он не может рассчитывать на вызов метода (Count(), например), не зная, сколько это ему будет стоит;

5) чтобы свойство имело не конкретный тип, а абстрактный, потому что так говорят великие десять заповедей восемь принципов ООП;

6) чтобы у этого типа были конструкторы без параметров, чтобы можно было использовать инициализацию в LINQ?

Вроде, ничего не забыл.

У меня такое ощущение, что я пытаюсь донести все эти пункты, а мне говорят "ну вот же тебе IEnumerable - он удовлетворяет четырём твоим трбованиям", или "любые три из шести", или "5 из 36" - спортлото какое-то получается.

На вскидку:

IEnumerable не подходит по п.4;
ICollection - п. 3;
IReadOnlyCollection - п. 6, т. к. реализует этот тырфейс из подходящих мне коллеций только ReadOnlyCollection, у которой конструктор с параметром - т. е. в линке не работает.
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38422323
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320, ну у тебя походу два выхода: переписать код нормально, либо реализовать свой класс коллекции, блеать!
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38422362
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или добавить свойство:
Код: c#
1.
public int GroupsCount { get; }
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38422780
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, если есть каунт, то ленивые загрузки уже не катят, а раз так, то гулять так гулять. Тем более, что там не более 20 записей в одной таблице и на каждую из них по 0-5 записей через связь. Чёжь вы сразу не сказали, что надо делать так:

Код: 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.
30.
31.
32.
33.
34.
35.
public class GroupModel
{
    public IReadOnlyCollection<BiogroupModel> Biogroups { get; set; }
}

public class MyModel
{
    public IReadOnlyCollection<GroupModel> Groups { get; private set; }
    
    public MyModel()
    {
        using (DBLibrary.MyEntities db = 
		    new DBLibrary.MyEntities())
        {
            this.Groups = 
                (from wg in db.WeedGroups
                 select wg)
                 .ToList() // <-------------- СУТЬ!
                 .Select(selectedWG => new GroupModel()
                 {
                     Biogroups = selectedWG.Biogroups
                     .OrderBy(b => b.Name)
                     .Select(b => new BiogroupModel()
                     {
                         Id = b.Id,
                         DisplayName = b.Name
                     })
                     .ToList()
                     .AsReadOnly()
                 })
                 .ToList()
                 .AsReadOnly();
        }
    }
}



Вся суть в ToList после "from wg in db.WeedGroups select wg". Вот теперь эта штука удовлетворяет всем 6 требованиям. В смысле, что шестое ликвидировалось путём загрузки в память нужной коллекции. А все эти ленивые загрузки при таких смехотворных данных, как у меня - это эти, как их... а, преждевременные оптимизации, во!
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38422781
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот когда надо будет действительно чего-то там лениво делать или бояться, что слишком много загрузит из БД и сервер нагнёт, тогда да, можно будет отдельное свойство для Count сделать.
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38422799
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы не было расходов, можно фильтр поставить в "from wg in db.WeedGroups select wg", но у меня просто задача была как раз вытащить всё, без фильтра. Да, и у меня фигня написана была раньше в этом месте

Biogroups = db.Biogroups
.Where...

А сейчас сделал так

Biogroups = selectedWG.Biogroups
.Where...
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38422824
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

а че амнет галочки как загрузить?(по требованию или всегда)
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38422830
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТС тебя кто научил в конструкторе такое вытворять?
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38422871
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRuТС тебя кто научил в конструкторе такое вытворять?
Да вы к словам не привязывайтесь - мы уже это обсудили. Это такой тестовый код, чтобы репозиторий не писать. Главное то, что я отметил как "СУТЬ".
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38423001
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Короче, если есть каунт, то ленивые загрузки уже не катят, а раз так, то гулять так гулять. Тем более, что там не более 20 записей в одной таблице и на каждую из них по 0-5 записей через связь. Чёжь вы сразу не сказали, что надо делать такТебе сразу намекнули, что ты пишешь плохой код.
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38423321
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAuser7320Короче, если есть каунт, то ленивые загрузки уже не катят, а раз так, то гулять так гулять. Тем более, что там не более 20 записей в одной таблице и на каждую из них по 0-5 записей через связь. Чёжь вы сразу не сказали, что надо делать такТебе сразу намекнули, что ты пишешь плохой код.
А новый лучше?
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38423350
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320skyANAпропущено...
Тебе сразу намекнули, что ты пишешь плохой код.
А новый лучше?Неа.
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38423516
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAuser7320пропущено...

А новый лучше?Неа.
А по-моему, лучше. Ведь я реализовал всё, что хотел. А репозиторий будет в следующей серии... или в следующем сезоне.
...
Рейтинг: 0 / 0
Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
    #38424025
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А репозиторий тут не при чём.
Первое: твой код тупо нарушает принцип единственности ответственности...

Купи себе книжку по ООП в следующем сезоне.
...
Рейтинг: 0 / 0
24 сообщений из 74, страница 3 из 3
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как поступить, если очень хочется использовать LINQ и конструкторы с параметрами?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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