Entity Framework - частичное заполнение
От: SanyaVB  
Дата: 24.02.17 18:30
Оценка:
Допустим у нас есть таблица Table с полями C1, C2, C3, C4, C5

И есть класс
class TableClass
{
  public string C1{get;set;}
  public string C2{get;set;}
  public string C3{get;set;}
  public string C4{get;set;}
  public string C5{get;set;}
}

И допустим у нас есть процедура GetFirstRow, которая возвращает первую строчку таблицы Table, но не все поля, а только C1, C2, C3
Ниже приведён код с ошибкой, т.к. при такой записи необходимо чтобы процедура GetFirstRow возвращала все 5 полей!
                using (DataBaseContext db = new DataBaseContext ())
                {
                    TableClass row = db.Database.SqlQuery<TableClass>("GetFirstRow").FirstOrDefault();
                }


Как можно сделать так чтобы вышеописанный пример заработал? Причем не меняя содержимое класса TableClass заработал и такой пример:
                using (DataBaseContext db = new DataBaseContext ())
                {
                    TableClass row = db.Database.SqlQuery<TableClass>("GetFULLFirstRow").FirstOrDefault();
                }

Где GetFULLFirstRow возвращает все 5 полей таблицы!!!
Re: Entity Framework - частичное заполнение
От: QrystaL Украина  
Дата: 24.02.17 21:02
Оценка:
Здравствуйте, SanyaVB, Вы писали:
SVB>И допустим у нас есть процедура GetFirstRow, которая возвращает первую строчку таблицы Table, но не все поля, а только C1, C2, C3

var row = db.Set<TableClass>().Select(x => new { x.C1, x.C2, x.C3 }).FirstOrDefault();


SVB>Где GetFULLFirstRow возвращает все 5 полей таблицы!!!


var fullRow = db.Set<TableClass>().FirstOrDefault();


P.S. Если у вас процедуры, то зачем Entity Framework?
Отредактировано 24.02.2017 21:03 QrystaL . Предыдущая версия .
Re[2]: Entity Framework - частичное заполнение
От: SanyaVB  
Дата: 25.02.17 17:45
Оценка:
Здравствуйте, QrystaL, Вы писали:

QL>P.S. Если у вас процедуры, то зачем Entity Framework?


Ну... ээээ.... получил вопрос на вопрос . Как будто к евреям попал
Ну тогда давайте я отвечу на ваш вопрос, а вы на мой. Мы можем отвечать параллельно, т.к. они не взаимозависимые

1) Иногда не все (в частности производительности) можно сделать простым функционалом EF, именно поэтому в EF добавили функционал вызова собственного запроса!
2) EF примечателен тем, что в нем заложен механизм преобразования полученных данных в объект (или наоборот). Раньше приходилось писать это все в ручную... много рутинной работы

ОТВЕТ: нет желания тянуть EF и старый добрый SQL провайдер
Re[3]: Entity Framework - частичное заполнение
От: TK Лес кывт.рф
Дата: 26.02.17 16:46
Оценка:
Здравствуйте, SanyaVB, Вы писали:

SVB>1) Иногда не все (в частности производительности) можно сделать простым функционалом EF, именно поэтому в EF добавили функционал вызова собственного запроса!

SVB>2) EF примечателен тем, что в нем заложен механизм преобразования полученных данных в объект (или наоборот). Раньше приходилось писать это все в ручную... много рутинной работы

SVB>ОТВЕТ: нет желания тянуть EF и старый добрый SQL провайдер


EF примечателен тем, что предоставляет набор верёвочек для того, чтобы отвязать сервер от клиента.
Если нужен просто маппер данных то и используйте маппер данных — их полно разных.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[4]: Entity Framework - частичное заполнение
От: SanyaVB  
Дата: 26.02.17 17:54
Оценка:
Здравствуйте, TK, Вы писали:

TK>EF примечателен тем, что предоставляет набор верёвочек для того, чтобы отвязать сервер от клиента.

TK>Если нужен просто маппер данных то и используйте маппер данных — их полно разных.

А если нужны верёвочки и мапер??? нужно использовать 2 технологии?
Тут речь идет именно об этом! Нет желания тянуть 2(или более технологии) и не хочется останавливаться на одной технологии, а именно на обычном SQL провайдере исключая EF, т.к. на нем много чего завязано.

Для решения вопроса я сделал грабли: создал базовый класс и от него наследовал другой класс, который был для него расширением. Задача решилась, но блин!!!! Это не правильно! Допустим у нас в БД 10 полей и нам потребуется использовать всевозможные комбинации полей как результат SELECT. Простая комбинаторика 10!/ 4! — это для случая 4 полей. Ну и что??? 27 млн классов создавать? Я понимаю что это теория... и в жизни нам необходимо всего лишь 2-4 возможный результата SELECT, НО!!! Придумывать название классов для одинаковых по существу данных — это БРЕД! Когда можно просто неиспользуемые поля присвоить значение по умолчание(например NULL)

И вопрос мой был тут написан именно потому что я предполагаю что EF это все реализует, а как??? я этого не знаю молчит Вот обращаюсь с вопросом КАК к знающим людям!
Скажу честно! Удивлюсь если в EF это не заложено!!!
Re[5]: Entity Framework - частичное заполнение
От: Neco  
Дата: 26.02.17 22:09
Оценка:
Здравствуйте, SanyaVB, Вы писали:

SVB>Скажу честно! Удивлюсь если в EF это не заложено!!!

Сразу скажу, не спец и не фанат EF, но насколько я знаю:
В EF заложено умение извлекать только нужные поля в зависимости от запрошенной проекции (т.е. перечисленных в селекте полей). Для себя я сделал вывод, что эту фишку сложно использовать на практике, поскольку проекция отделена от EF несколькими слоями и протащить метаданные об использовании к месту извлечения как-то сложно. Поэтому для себя я всегда ограничивался созданием пары версий классов (light и full), которые удовлетворяли мои нужды. "Иметь в некоторых случаях null в полях", мне кажется стабильным источником для багов.

Плюс в EF есть возможность ленивой загрузки и явной загрузки. В сочетании с парой классов — вполне рабочая схема вырисовывается.
всю ночь не ем, весь день не сплю — устаю
Re[6]: Entity Framework - частичное заполнение
От: SanyaVB  
Дата: 27.02.17 10:03
Оценка:
Здравствуйте, Neco, Вы писали:

N>Здравствуйте, SanyaVB, Вы писали:


SVB>>Скажу честно! Удивлюсь если в EF это не заложено!!!

N> "Иметь в некоторых случаях null в полях", мне кажется стабильным источником для багов.

Полностью с вами согласен! Хорошо что существуют UnitTest-Ы
Re: Entity Framework - частичное заполнение
От: Danchik Украина  
Дата: 27.02.17 11:09
Оценка:
Здравствуйте, SanyaVB, Вы писали:

[Skip]

Это называется проекция
db.Database.SqlQuery<TableClass>("GetFULLFirstRow").Select(t => new TableClass{ C1 = t.C1 }).FirstOrDefault();


И да, если вам не надо чендж трекера, то я бы лучше посмотрел на Linq провайдеры которые получше оптимизируют запросы и побыстрее работают.
Например linq2db
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.