Entity Framework Определение запроса + IsNull + Left Join = Слишком медленно - PullRequest
2 голосов
/ 13 апреля 2011

У меня есть этот оператор SQL

select st.Column1, isnull(sot.SomeColumn, 0) as SomeColumn 
from SomeTable st 
left join SomeOtherTable sot 

внутри тега <DefiningQuery> в моем файле Entity Framework (4.0) .edmx, и я столкнулся с серьезной проблемой производительности. Выполнение SQL в том виде, в котором оно написано, выполняется быстро, но EF оборачивает SQL во время выполнения для введения параметров, что значительно замедляет его.

Я могу убрать isnull, и в упакованном EF SQL он работает так же быстро, как и изначально, но мне нужно, чтобы isnull гарантировал, что SomeColumn имеет значение.

Есть ли какие-нибудь альтернативы isnull, которые я мог бы использовать здесь, чтобы они хорошо играли с EF?

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 13 апреля 2011

В свойствах свойства в конструкторе EF должно быть свойство значения по умолчанию, хотя я не уверен, что оно будет соответствовать вашим потребностям.В качестве альтернативы, все сущности, сгенерированные из вашей модели EF, являются частичными.Я бы добавил еще одно свойство, которое оборачивает свойство SomeColumn (без isnull), чтобы предоставить значение по умолчанию.Учитывая, что SomeColumn, скорее всего, будет отображаться как обнуляемое целое, вы можете определить новое свойство следующим образом:

public SomeColumnWithDefaultValue {
    get { return this.SomeColumn ?? 0; }
    set { this.SomeColumn = value; }
}

Вы должны написать свои запросы к SomeColumn, а затем использовать SomeColumnWithDefaultValue там, где вам необходимо убедиться, что оно ненуль.

0 голосов
/ 02 мая 2011

Мое решение состояло в том, чтобы полностью исключить любое использование isnull из моего SQL и вместо этого включить SELECT NEWID() AS ID (необходимо, чтобы он был совместим с SQL 2000+) для всех этих запросов.После того, как я установил ID в качестве моего единственного <EntityKey>, я мог бы разрешить установить любое из свойств левого соединения как isnullable=true, и мне больше не приходилось иметь дело с замедлением EF..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...