powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF работа с code first или database first?
25 сообщений из 88, страница 3 из 4
EF работа с code first или database first?
    #39682466
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stutНо последнее выражение что то очень сложное.Используй Dynamic Linq - он будет делать то же самое, но за кадром.

stutне верю что нет возможности использовать полное имя свойства класаstutВ предыдущем варианте в плоском Ado.netКак это делается, я показал выше - можешь не верить дальше. Ты уж определись, что ты хочешь, типизацию или полную свободу в виде динамики. Если типизация - принимай правила игры. Для 8-10 полей, можно и тупой switch написать. Если хочешь динамику - пиши SQL ручками.
Тебя, например, не смущает, что в TSQL в процедуре ты не можешь сделать переменным имя поля. Потому что процедура проходит компиляцию. И если очень хочешь динамику - пишешь полностью динамический запрос. Здесь то же самое.
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39682483
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stutЕсли перенести в новую тему модераторами я не против.самому Скопировать как делают все лень конечно.
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39682661
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все же вышло не трудно найти вариант: value[i]=context.Balances.Where(y=>y.Date>=d2&&y.Date<=d4).Sum(x=>(int)x.GetType().GetProperty(name[i] .GetValue(x,null); - однако выскакивает эксепшн -
LINQ to Entities does not recognize the method 'System.Object GetValue(System.Object, System.Object[])' method, and this method cannot be translated into store expression. Вроде в интернете написано что надо специальнь писать Expression, с чем я вообще не имел дела, хотя вроде все очень просто вышло перед этим. И каких то вменяемых примеров не нашел.
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39682751
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе бы надо понять для начала
- что такое лямбда и во что она компилируется
- что такое IEnumerable, как работает Linq и что такое Expression
- как работает Linq2Sql и что такое IQueryable
В общем, надо учебник почитать по .NET и C#
Тогда у тебя не будет странных потуг использовать GetType


stutписать Expression ..... И каких то вменяемых примеров не нашел.Пример, который я дал выше, невменяемый?
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39682768
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stut,
Динамика это повышенный уровень программирования. Иногда показан, иногда противопоказан. Так что дерзайте и думайте.
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39682782
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не за много будет читать учебник и теорию 10-ый раз? В чем проблема с gettype() - что он возвращает тип обьекта, а не дальше по чейну свойсво и значение свойства обьекта? Что экспрешн единственный выход здесь? Это понятно что linq to entity(sql) компилируется в sql - но я так думаю что можно и без этих двух вариантов обойтись только используя foreach, if. Но тогда придется перечислять все свойства вручную, но без gettype.getproperty(..) не обойтись.
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39682867
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот сколькоо не обращался здесь- всегда предлагают оклоличные пути. Предлагают читать книги, если здесь надо было бы один пример. Больше того - как раз был пропал интернет - и решение пришло с помощью самого IDE - а именно выпадающего метода AsEnumerable() - после самого linq. И действительно методы рефлексии уже с Enumeration - не вызывали экспепшена - надо было только обойти значение null из таблицы. Привожу здесь решение, без никаких экспрешенов:
value[i]=context.Balances.Where
(y=>y.Date>=d2&&y.Date<=d4).AsEnumrable().Sum(x=>
x.GetType().GetProperty(name[i])GetValue(x,null)!=null?(int)x.GetType().GetProperty(name[i])GetValue(x,null):0); Не было проще написать чтобы трансформировать iqueriable в enumerable.
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39682875
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stutи решение пришло с помощью самого IDE - а именно выпадающего метода AsEnumerable()Ну если ты все понимаешь про компиляцию запросов, почему ты сразу это сам сразу не предложил конвертировать в IEnumerable?

Ну и ты понимаешь, что если раньше ты запрашивал с сервера одну строку - всего лишь сумму миллиона строк, то теперь ты перекачиваешь миллион строк с сервера на клиента и суммируешь на клиенте. Плюс рефлексия в цикле, причем даже постоянную величину в виде получения Property ты умудрился засунуть внутрь цикла. Ну раз все это тебя это устраивает - вперед к новым победам над производительностью и здравым смыслом!
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39682876
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stutВот сколькоо не обращался здесь- всегда предлагают оклоличные пути. Предлагают читать книгиТак а зачем ты обращаешься здесь? Жми точку в студии, она сама предложит варианты. Понимать-то необязательно, как оно работает. А, ну и в гугле тоже все идиоты - предлагают конструировать Expression, вместо того чтобы по простому запилить AsEnumerable
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39682877
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stutНо тогда придется перечислять все свойства вручную, но без gettype.getproperty(..) не обойтись.Зачем getproperty-то????
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
switch (fieldName)
{
  case nameof(MyEntity.MyField1):
    myQuery = myQuery.Sum(n => n.MyField1);
    break;
  ...
  ...
}


stutчитать учебник и теорию 10-ый раз?Да. Опыт показывает, что поначалу пропускаешь некоторые моменты, потому что еще не в теме в принципе. Так что и в 10-й раз прочитать не зазорно.
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39682891
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
switch (fieldName)
{
 case nameof(MyEntity.MyField1):
    myQuery = myQuery.Sum(n => n.MyField1);
    break;
  ...
  ...
}

+1
Вот несколько ТС ты упрям, что пятый пост доказываешь что без динамики не жить.
Оказывается можно!
Плюс тему ещё замусолил.
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39682892
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123+1Этот вариант хорош статикой. и заодно предохраняет от инъекции. А то (условно говоря) злоумышленник сможет просуммировать и поле с номером кредитной карты (при выборке в одну запись)

Но если динамика все-таки будет логичнее, я бы один раз написал конструктор выражения для Sum в библиотеку и юзал бы где ни попадя. Но ТС почему-то хочет надеть штаны через голову
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39683376
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за позитив.
В любом случае хотел разобратся сегодня из этими експрешн-три... На предыдущей странице приведена функция фильтра - который возвращает bool - но надо в функции LINQ.SUM(...) - Expression<Func<T,int>>?
Такой тоже позаимствованный код- Parameter Expression
pe =
Expression.Parameter
(typeof(Balance),
"b");
Expression<Func<Balance,
int>> expr =
Expression.Lambda<Func<Balance,
int>>
( Expression.Property
(pe, "Sales"), pe); return expr; - не подойдет?
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39683391
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
во-первых Как мне оформить свое сообщение?

во-вторых, а где в выражении собственно суммирование?
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39683410
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так в функцию Sum(...) надо передать аргумент, а функция уже сумирует. В любом случае, до сего момента, с деревьями выражений не имел дело (тем более в книгах). Вот есть Expression.Property(...), что возвращает какое то непонятное выражение. Вот если бы с помощью какой то функции (встроенной, кастомной, lambda) из него получить заветное object.property - вот тогда все это имеет смысл. Хотя в Quaryable.Sum(...) как раз то надо экспрешен.
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39683412
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В моем варианте - главное избавится от двойного применение getvalue() через присутствие null. Кстати можно было и применить switch() - но когда-то делали ревью этого тестового таска, то негативно оценили использование более 5-ти if() потому я решил применить более автоматический способ.
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39683424
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stutно когда-то делали ревью этого тестового таска, то негативно оценили использование более 5-ти if()
Вот причина всех поисков понапрасну.
Более 5 ти if или switch это нормально.
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39683425
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stutпотому я решилверно. Вместо того чтобы наращивать функционал, программист решил...
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39683450
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stutя решил применить более автоматический способ.Ты решил не более автоматический способ применить, а отказаться от суммирования на стороне сервера. Я тебе это выше объяснял, но, видимо, не дошло. ( и интересно, как этому отнеслись те, кто делал ревью, или им пофиг? )
Более автоматическим способом было бы использование библиотеки Dynamic Linq для формирования выражения.


stutнегативно оценили использование более 5-ти if()потому что дилетанты.

Задача:
Вывести в консоль три раза строку ABCDEF:

Код: 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.
// профи:

Console.WriteLine("ABCDEF");
Console.WriteLine("ABCDEF");
Console.WriteLine("ABCDEF");

// полу-профи:

Console.WriteLine("ABCDEF\nABCDEF\nABCDEF");

// любитель-дилетант

for(var i = 0; i < 3; ++i)
{
   Console.WriteLine("ABCDEF");
}

// упоротый любитель-дилетант

for(var i = 0; i < 3; ++i)
{
   for(var a = 'A'; a <= 'F'; ++a) Console.Write((char)a);
   Console.WriteLine();
}
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39683451
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять же, если упоротые дилетанты запрещают тебе ковырять в носу использовать if-ы, кто тебе мешает заранее сформировать массив выражений по каждому полю и сложить их в Dictionary<string, Expression<Func<T, int>>> и потом извлекать оттуда по индексу sums[fieldname]. Это-то тебе твои гуру разрешат?
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39683455
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stutВ моем варианте - главное избавится от двойного применение getvalue() через присутствие null.Твой вариант надо выкинуть на помойку. Но сам этот вопрос показывает, что ты толком даже не понял, что такое делегат. Так что не зря я тебя отправлял читать учебник.
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39683459
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зря вы критикуете. На стековере много подобных вопросов - и многие там бы хотели применить рефлексию но как там написано она не работает с getvalue(). Вот привожу краткий метод, который надо передать как аргумент в Sum(...). Но так же применить к нему .compile() иначе получаю какой то алогичный эксепшн - что нуллабл тайп должны иметь значение: public static Expression<Func<Balance,int>> selectonefield (object value, string Prop) { ParameterExpression pe=Expression.Parameter(typeof(Balance), "balance"); Expression<Func<Balance,int>> expression = Expression.Lambda<Func<Balance,int>>(Expression.Property(pe,Prop), pe); return expression;}
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39683464
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рефлексия не работает с GetValue()! это выше моих сил.

stutВот привожу краткий методТы просто не читаешь, что я пишу. Даже ссылку на то, как свой код оформлять. Похоже, тебя бесполезно направлять на правильный путь, ты, видимо, из принципа будешь делать по-своему.
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39683465
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Говоря о чтение книг - лутче ознакомится с примерами - например с двумя строками с https://www.codeproject.com/Articles/235860/Expression-Tree-Basics. Странно что в моем методе value вообще не используется в описание метода. Хотя при сумирование передается ссылка this на обьект. Касательно делегатов то как начинающего с джавы, они часто кажутся усложнением ситуации. Как и ваша параметризация название метода Selectonefrommany<T>, если это не заведомая ошибка. Так же можно заменить что это linq можно погрупировать по свойству но придется использовать динамику, создавать новые анонимные типы с полями названия свойства, и сумы по свойству - или применять дикшионари, но зачем. И кстати это десктопная апликация что имеет мало общего с серверами - хотя понятно что потребность в такой апликации может возникнуть и в большой корпоративной системе.
...
Рейтинг: 0 / 0
EF работа с code first или database first?
    #39683466
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сори, Quaryable, в отличие от Enumerable не работает с методом рефлексии PropertyInfo.GetValue(...).
...
Рейтинг: 0 / 0
25 сообщений из 88, страница 3 из 4
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF работа с code first или database first?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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