Насколько эффективно вызывать UDF и sproc из моего LINQ to SQL?

Я столкнулся с проблемой, когда мне нужно вызвать UDF в моем LINQ to SQL, а затем другую хранимую процедуру внутри него. Вот код.

    public IQueryable<DataDTO> GetLotsaData(string dataId, DateTime date, string custIDs)
    {
        var data = (from rs in _context.spXI_GetData(dataId, date, custIDs)
                          select new DataDTO
                          {
                              Time = rs.Time,
                              TimeZone = _context.GetTimezone(postDate, _context.GetDetailedData(rs.PKID, custIDs).FirstOrDefault().Zip),
                              CompletedTime = rs.Completed_Time,
                          });

        return data.AsQueryable<DataDTO>();
    }

Меня беспокоит строка, в которой я вызываю пользовательскую функцию GetTimezone. Неэффективно ли вызывать UDF в середине запроса LINQ, а затем другую хранимую процедуру (GetDetailedData), чтобы получить одно значение для этой UDF? Какой тип SQL это сгенерирует?

Это выглядит немного запутанным для меня, но все же лучше, чем альтернатива, которая была бы подвыборкой или соединением в моей хранимой процедуре. (Я пытаюсь избежать того, чтобы моя хранимая процедура возвращала новое поле — TimeZone — вместо этого просто возвращала его в мой DTO.) И да, я понимаю, что всего этого можно было бы избежать, если бы мы использовали UTC. К сожалению, я не могу это контролировать.


person Gary the Llama    schedule 14.04.2011    source источник


Ответы (2)


Почему spXI_GetData не может вернуть полный набор результатов? Я бы сказал, что это было бы оптимально в данной ситуации.

person William Xifaras    schedule 26.04.2011

Функции GetTimezone и GetDetailedData будут вызываться для каждой строки в наборе spXI_GetData. Было бы лучше, если бы функция GetTimezone могла возвращать встроенную таблицу, а вместо этого вы могли бы присоединиться к ней.

person Magnus    schedule 26.04.2011