powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Entity Framwork 6 raw sql
22 сообщений из 22, страница 1 из 1
Entity Framwork 6 raw sql
    #38734381
Stanislav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите возможно ли как-то выполнить SQL запрос средствами Entity Framwork c заранее неизвестной структурой?

вот пример для одной колонки
Код: c#
1.
var blogNames = context.Database.SqlQuery<string>( "SELECT Name FROM dbo.Blogs").ToList(); 



а что-то типа этого, но для всех колонок?
например
Код: c#
1.
var blogNames = context.Database.SqlQuery<object[]>( "SELECT * FROM dbo.Blogs").ToList(); 


или может быть dynamic какой-нибудь. Или datareader.
Вроде бы и EntityDataReader есть, но он не работает с raw sql
...
Рейтинг: 0 / 0
Entity Framwork 6 raw sql
    #38734425
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Entity Framwork 6 raw sql
    #38734436
gandjustas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav,
DbDataRecord в качестве типа не прокатит?
...
Рейтинг: 0 / 0
Entity Framwork 6 raw sql
    #38734438
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,
послушай, вот вопрос
EF схавает такую фишку
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 class Program
    {
        static void Main(string[] args)
        {
           var res= GetEnumerable(new {name = "", id = 1});
        }

        static  IEnumerable<T> GetEnumerable<T>(T t)
        {
            return context.Database.SqlQuery<T>("SELECT name,id FROM dbo.Blogs");
        }
    }


конечно это имхо противоречит концепции, но может есть там такая французская булка?

зы сам не могу проверить ((
...
Рейтинг: 0 / 0
Entity Framwork 6 raw sql
    #38734556
Stanislav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ http://codearticles.ru/articles/719
Спасибо, то что нужно!
...
Рейтинг: 0 / 0
Entity Framwork 6 raw sql
    #38734594
Stanislav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gandjustasStanislav,
DbDataRecord в качестве типа не прокатит?
прокатит, в примере выше как раз так и сделано.
Спасибо!
...
Рейтинг: 0 / 0
Entity Framwork 6 raw sql
    #38734660
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиконечно это имхо противоречит концепции, но может есть там такая французская булка?
Мысль светлая, но мельница не заводится...

The result type '<>f__AnonymousType0`2[System.Int32,System.String]' may not be abstract and must include a default constructor.

StanislavgandjustasStanislav,
DbDataRecord в качестве типа не прокатит?
прокатит, в примере выше как раз так и сделано.
Спасибо!
Не совсем. В примере не используется DbDataRecord (добавил к рецепту 3 вариант ). ObjectQuery<DbDataRecord> - плохой способ, SELECT * не поддерживается, требования к SQL немного иные. Нельзя скопировать туда валидный SQL и ожидать, что это заработает. Но тем не менее, это рабочий вариант. Публикую.
...
Рейтинг: 0 / 0
Entity Framwork 6 raw sql
    #38734690
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,
Моя жестоко негодует, ну ладно у ребят нет юмора ( реализовать мой пример, это всего лишь 10-15 строчек кода - добавить в фрейм)
но - and must include a default constructor наводит на мысль что ребята продолжают пользоваться шедевральным -activator.createinstance<T>, я теперь спокоен за EF, у него есть резервы для скорости и развития.
зы Он мне сразу напомнил армию, все четко и по уставу ( от обеда до забора) )))
...
Рейтинг: 0 / 0
Entity Framwork 6 raw sql
    #38734726
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи, не паникуй :) EF всё-равно остается самым внятным и толковым ORM.
...
Рейтинг: 0 / 0
Entity Framwork 6 raw sql
    #38734732
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,
Да это я так.. поворчал для приличия :))
...
Рейтинг: 0 / 0
Entity Framwork 6 raw sql
    #38737839
gandjustas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиМСУ,
Моя жестоко негодует, ну ладно у ребят нет юмора ( реализовать мой пример, это всего лишь 10-15 строчек кода - добавить в фрейм)
но - and must include a default constructor наводит на мысль что ребята продолжают пользоваться шедевральным -activator.createinstance<T>, я теперь спокоен за EF, у него есть резервы для скорости и развития.
зы Он мне сразу напомнил армию, все четко и по уставу ( от обеда до забора) )))

С чего этот «гениальный» вывод?
...
Рейтинг: 0 / 0
Entity Framwork 6 raw sql
    #38737841
gandjustas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

Речь идет о
Код: sql
1.
context.Database.SqlQuery<DbDataRecord>
...
Рейтинг: 0 / 0
Entity Framwork 6 raw sql
    #38737912
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gandjustasМСУ,

Речь идет о
Код: sql
1.
context.Database.SqlQuery<DbDataRecord>



Глупости. Это работать не будет.
...
Рейтинг: 0 / 0
Entity Framwork 6 raw sql
    #38738047
gandjustas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

Проверял?
...
Рейтинг: 0 / 0
Entity Framwork 6 raw sql
    #38738048
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gandjustasМСУ, Проверял?
А ты? Коль предложил, ждем в студию рабочий код.
...
Рейтинг: 0 / 0
Entity Framwork 6 raw sql
    #38739982
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gandjustas, где ответ или ты решил отмолчаться?
...
Рейтинг: 0 / 0
Entity Framwork 6 raw sql
    #38740107
gandjustas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУgandjustas, где ответ или ты решил отмолчаться?

Только из Греции вернулся, там доступа к студии не было.

Так НЕ работает:
Код: c#
1.
context.Database.SqlQuery<DbDataRecord>



Но можно написать примерно так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public static DbDataReader ExecuteReader(this DbContext ctx, string queryText);
{
    var cmd = ctx.Database.Connection.CreateCommand();
    cmd.CommandText = queryText;
    return cmd.ExecuteReader();
}

context.ExecuteReader("SELECT * FROM dbo.Blogs");
...
Рейтинг: 0 / 0
Entity Framwork 6 raw sql
    #38740162
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gandjustasТак НЕ работает:
Код: c#
1.
context.Database.SqlQuery<DbDataRecord>


Что и требовалось доказать, о чём я тебе и говорил. Поэтому, прежде чем что-то советовать, убедись в работоспособности предлагаемого варианта.

gandjustasНо можно написать примерно так
Именно так у меня и сделано в 2 рецептах, на DbDataReader.
...
Рейтинг: 0 / 0
Entity Framwork 6 raw sql
    #38740844
gandjustas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

Ты обкурился? Я вопрос задавал, а не советовал.
...
Рейтинг: 0 / 0
Entity Framwork 6 raw sql
    #38757494
Gluck_13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиМСУ,
послушай, вот вопрос
EF схавает такую фишку
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 class Program
    {
        static void Main(string[] args)
        {
           var res= GetEnumerable(new {name = "", id = 1});
        }

        static  IEnumerable<T> GetEnumerable<T>(T t)
        {
            return context.Database.SqlQuery<T>("SELECT name,id FROM dbo.Blogs");
        }
    }


конечно это имхо противоречит концепции, но может есть там такая французская булка?

зы сам не могу проверить ((

Сам по себе - не схавает, но для EF5 получилось допилить таким образом, чтобы динамический SQL можно было представить в виде типизированного IQueryable<T> с возможностью дальнейшего использования в других LINQ - запросах. Очень удобно для композиции запросов со временными таблицами.

Кода до фига, опишу ключевые моменты:
1. Пишется wrapper для SQL-провайдера (примеры есть в I-Net)
2. Динамический SQL инжектится в дерево выражений через вызов табличной функции. Функция в БД не нужна, она все равно заменится на последующих этапах. В момент инжекта функции сам динамический SQL и описание типа для IQueryable передается в функцию через строковые параметры в виде Expression.Constant.
3. Во wrappere провайдера перехватывается создание DbCommandDefinition и визитором проходится DbQueryCommandTree с заменой вызова фэйковой табличной функции на запрос (DbScanExpression) к динамически созданному EntitySet с definingquery, соответствующим нашему динамическому SQL. Текст динамического запроса и описание выходного типа достается из аргументов DbFunctionExpression в виде DbConstantExpression. Здесь вовсю дергаются internal и private из EF, код сгенерирован в виде dynamic-метода. Как показало изучение кода транслятора DbExpressionTree в SQL, EF не обращает внимания на то, что новый динамический тип физически не входит в наш MetadataWorkspace (хотя и приходится создавать в нем ссылку на наш EntityContainer).
4. Также в DbQueryCommandTree вносятся некоторые изменения в проекции DbNewInstanceExpression для преобразования выхлопа фэйковой функции к динамическому EntityType, сгенерированному на шаге 3.

Надеюсь, что при переходе на EF6 (Open-Source), игрищ с wrapper-ом и internal-методами можно будет избежать. Тогда можно будет попробовать оформить код более компактно, сейчас же, к сожалению, поделиться им не смогу, ибо он потянет за собой кучу кода из слоя доступа к данным.
...
Рейтинг: 0 / 0
Entity Framwork 6 raw sql
    #38757799
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluck_13,
Честно сказать, снимаю шляпу, советую загитхабить ваш код, не плохой инструмент может получиться для тактических задач.
...
Рейтинг: 0 / 0
Entity Framwork 6 raw sql
    #38758349
Gluck_13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

Да я бы с удовольствием статейку бы оформил. Только код тяжело из рабочего проекта выдрать. Он обвязан базовыми библиотеками, например, динамические методы генерятся через IL extensions, мэппинг функций (в т.ч. табличных) осуществляется через собственные расширения CodeFirst и т.п. Да и насколько корректно публиковать код, который что-то дергает из internal и private классов/членов EF?

Вот скоро (через квартал-другой) планируем мигрировать под EF6. Открытый исходный код позволит внедриться без Wrapper-а провайдера и генерации IL. Там и объем кода станет обозримым для выдергивания его из проекта.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Entity Framwork 6 raw sql
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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