powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Использование пользовательских фунций в ADO.NET Entity запросе
12 сообщений из 12, страница 1 из 1
Использование пользовательских фунций в ADO.NET Entity запросе
    #38608960
CoderID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Каким образом можно использовать пользовательские фунции в ADO.NET EF запросе?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
var data = from w in _Context.Workers
select new WorkerData()
{
WorkTime = HoursMinsSecs(w.StartTime, w.StopTime);
};

public string HoursMinsSecs(DateTime startTime, DateTime endTime)
{
TimeSpan span = (endTime - startTime);

return String.Format("{0} hours, {1} minutes, {2} seconds",
                                 span.Hours, span.Minutes, span.Seconds);
}


Я получаю ошибку:

авторLINQ to Entities does not recognize the method 'System.String HoursMinsSecs(System.DateTime, System.DateTime)' method, and this method cannot be translated into a store expression.
...
Рейтинг: 0 / 0
Использование пользовательских фунций в ADO.NET Entity запросе
    #38608973
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CoderID,

1) Сначала материализовать данные, потом выполнить метод
2) Воспользоваться чем-то подобным: http://msdn.microsoft.com/en-us/library/dd456812.aspx
...
Рейтинг: 0 / 0
Использование пользовательских фунций в ADO.NET Entity запросе
    #38608979
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут описано расширение LINQ-провайдера Entity Framework, позволяющее делать нечто подобное.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
class SvcPersonal
{
    // Описание выражения, с целью его повторного использования.
    static readonly Expression<Func<personal, string>> GetFullName = 
        p => p.LastName + " " + p.FirstName + " " + p.PatrName;
 
    public string GetFullNameByID(int id)
    {
        using (var sc = DbMainFactory.Scope)
        {
            var q =
                from p in sc.Content.personal
                where p.ID == id
 
                // Подстановка выражения вместо вызова расширяющего метода Invoke.
                select GetFullName.Invoke(p);
 
            return q.First();
        }
    }
}
...
Рейтинг: 0 / 0
Использование пользовательских фунций в ADO.NET Entity запросе
    #38718288
CoderID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как правильно материализовать данные?
Я пробую вызвать
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
        <Function Name="YearsSince" ReturnType="Edm.Int32">
          <Parameter Name="date" Type="Edm.DateTime" />
          <DefiningExpression>
            Year(CurrentDateTime()) - Year(date)
          </DefiningExpression>
        </Function>
 </Schema>
</edmx:ConceptualModels>


Выдает 'Unrecognized schema element Function'. Если вызывать внутри <edmx:StorageModels> выдает 'Unrecognized schema element: DefiningExpression'
...
Рейтинг: 0 / 0
Использование пользовательских фунций в ADO.NET Entity запросе
    #38718329
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я понимаю, автор имеет ввиду канонические функции в EF? Тогда вот http://codearticles.ru/articles/2342
...
Рейтинг: 0 / 0
Использование пользовательских фунций в ADO.NET Entity запросе
    #38718545
CoderID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется в виду возможность использовать любые пользовательские фунции в запросе.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
                var data = (from w in _Context.Data
                           select new
                                      {
                                          str=  MyStr(w.SomeData)
                                      }).ToList();


        public static string MyStr(string param)
        {
            return param.ToUpper();
        }
...
Рейтинг: 0 / 0
Использование пользовательских фунций в ADO.NET Entity запросе
    #38718593
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CoderID,

Код: c#
1.
2.
(from w in _Context.Data
 select w.ComeData).AsEnumerable().Select(x=> MyStr(x)).ToList()


В вашем примере - как то так.
...
Рейтинг: 0 / 0
Использование пользовательских фунций в ADO.NET Entity запросе
    #38718779
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CoderIDИмеется в виду возможность использовать любые пользовательские фунции в запросе
Не получится, можно использовать только канонические функции. Иначе функция не будет транслирована в SQL и будет ошибка. Либо применять "любые функции" уже к IEnumerable. Но это уже к EF не относится.
...
Рейтинг: 0 / 0
Использование пользовательских фунций в ADO.NET Entity запросе
    #38719136
CoderID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LelouchCoderID,

Код: c#
1.
2.
(from w in _Context.Data
 select w.ComeData).AsEnumerable().Select(x=> MyStr(x)).ToList()


В вашем примере - как то так.

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

В чем же примущества EF перед обычными хранимыми процедурами и ADO.NET?
...
Рейтинг: 0 / 0
Использование пользовательских фунций в ADO.NET Entity запросе
    #38719170
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CoderIDLelouchCoderID,

Код: c#
1.
2.
(from w in _Context.Data
 select w.ComeData).AsEnumerable().Select(x=> MyStr(x)).ToList()


В вашем примере - как то так.

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

CoderIDВ чем же примущества EF перед обычными хранимыми процедурами и ADO.NET?Предлагаю отложить ормосрач до пятницы.
...
Рейтинг: 0 / 0
Использование пользовательских фунций в ADO.NET Entity запросе
    #38719171
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУНе получится, можно использовать только канонические функции.Слишком категорично. Не понравилось. :-)
...
Рейтинг: 0 / 0
Использование пользовательских фунций в ADO.NET Entity запросе
    #38757165
CoderID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

Спасибо. Это полезная вещь. Можно ли класс DbFunctionsEx из вашего проекта подключить к ObjectContext? Не получается использовать DbToString() применительно к ObjectContext API. Или может подскажете другое направление?
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Использование пользовательских фунций в ADO.NET Entity запросе
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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