Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Entity Framwork 6 raw sql / 22 сообщений из 22, страница 1 из 1
01.09.2014, 19:30
    #38734381
Stanislav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity Framwork 6 raw sql
Подскажите возможно ли как-то выполнить 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
01.09.2014, 22:44
    #38734425
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity Framwork 6 raw sql
...
Рейтинг: 0 / 0
01.09.2014, 23:12
    #38734436
gandjustas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity Framwork 6 raw sql
Stanislav,
DbDataRecord в качестве типа не прокатит?
...
Рейтинг: 0 / 0
01.09.2014, 23:28
    #38734438
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity Framwork 6 raw sql
МСУ,
послушай, вот вопрос
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
02.09.2014, 09:04
    #38734556
Stanislav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity Framwork 6 raw sql
МСУ http://codearticles.ru/articles/719
Спасибо, то что нужно!
...
Рейтинг: 0 / 0
02.09.2014, 09:37
    #38734594
Stanislav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity Framwork 6 raw sql
gandjustasStanislav,
DbDataRecord в качестве типа не прокатит?
прокатит, в примере выше как раз так и сделано.
Спасибо!
...
Рейтинг: 0 / 0
02.09.2014, 10:45
    #38734660
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity Framwork 6 raw sql
Где-то в степиконечно это имхо противоречит концепции, но может есть там такая французская булка?
Мысль светлая, но мельница не заводится...

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
02.09.2014, 11:14
    #38734690
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity Framwork 6 raw sql
МСУ,
Моя жестоко негодует, ну ладно у ребят нет юмора ( реализовать мой пример, это всего лишь 10-15 строчек кода - добавить в фрейм)
но - and must include a default constructor наводит на мысль что ребята продолжают пользоваться шедевральным -activator.createinstance<T>, я теперь спокоен за EF, у него есть резервы для скорости и развития.
зы Он мне сразу напомнил армию, все четко и по уставу ( от обеда до забора) )))
...
Рейтинг: 0 / 0
02.09.2014, 11:40
    #38734726
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity Framwork 6 raw sql
Где-то в степи, не паникуй :) EF всё-равно остается самым внятным и толковым ORM.
...
Рейтинг: 0 / 0
02.09.2014, 11:42
    #38734732
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity Framwork 6 raw sql
МСУ,
Да это я так.. поворчал для приличия :))
...
Рейтинг: 0 / 0
04.09.2014, 17:32
    #38737839
gandjustas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity Framwork 6 raw sql
Где-то в степиМСУ,
Моя жестоко негодует, ну ладно у ребят нет юмора ( реализовать мой пример, это всего лишь 10-15 строчек кода - добавить в фрейм)
но - and must include a default constructor наводит на мысль что ребята продолжают пользоваться шедевральным -activator.createinstance<T>, я теперь спокоен за EF, у него есть резервы для скорости и развития.
зы Он мне сразу напомнил армию, все четко и по уставу ( от обеда до забора) )))

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

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

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



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

Проверял?
...
Рейтинг: 0 / 0
04.09.2014, 23:28
    #38738048
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity Framwork 6 raw sql
gandjustasМСУ, Проверял?
А ты? Коль предложил, ждем в студию рабочий код.
...
Рейтинг: 0 / 0
07.09.2014, 21:58
    #38739982
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity Framwork 6 raw sql
gandjustas, где ответ или ты решил отмолчаться?
...
Рейтинг: 0 / 0
08.09.2014, 03:13
    #38740107
gandjustas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity Framwork 6 raw sql
МСУ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
08.09.2014, 09:00
    #38740162
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity Framwork 6 raw sql
gandjustasТак НЕ работает:
Код: c#
1.
context.Database.SqlQuery<DbDataRecord>


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

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

Ты обкурился? Я вопрос задавал, а не советовал.
...
Рейтинг: 0 / 0
25.09.2014, 13:55
    #38757494
Gluck_13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity Framwork 6 raw sql
Где-то в степиМСУ,
послушай, вот вопрос
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
25.09.2014, 16:34
    #38757799
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity Framwork 6 raw sql
Gluck_13,
Честно сказать, снимаю шляпу, советую загитхабить ваш код, не плохой инструмент может получиться для тактических задач.
...
Рейтинг: 0 / 0
26.09.2014, 07:17
    #38758349
Gluck_13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity Framwork 6 raw sql
Где-то в степи,

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

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


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