1

EDMX файл имеет свойствоEF6 Содержит запрос Кастинг

<Property Name="SomePrimaryKeyID" Type="bigint" /> 

соответствующего объекта является

<Property Type="Int64" Name="SomePrimaryKeyID" Nullable="false" /> 

Запрос:

long[] ids = new long[]{1234567,1234568}; 
    var results = context.SomeEntities.Where(x=> ids.Contains(x.SomePrimaryKeyID)).ToList(); 

Когда я использую содержит EF генерироваться запрос имеет явное литье, таких как

... WHERE SomePrimaryKeyID IN (CAST (1234567 AS BIGINT),CAST (1234568 AS BIGINT)) 

Поскольку long соответствует bigint, я не вижу необходимости в литье. Есть ли способ избежать этого броска?

+0

показать запрос, иначе невозможно определить, может ли быть удалено или нет. – Pawel

+0

Спасибо за вопрос. Добавлен запрос. – Lokeshwer

ответ

0

Для литеральных интегральных значений по умолчанию тип SQL Server является int. Из-за этого в вашем примере литеральные значения должны быть всегда выбраны (они были бы типа «int», если бы не было явного приведения), чтобы соответствовать типу SomePrimaryKeyID (который является большим int). Если явный случай отсутствовал, Sql Server должен был бы сделать неявный бросок, который фактически мог бы быть более дорогостоящим, поскольку он должен был сначала рассуждать о типе SomePrimaryKeyID, чтобы знать, что отличать литеральные числа.

+0

Как эти запросы различаются 1. «выберите * из SomeEntity, где SomePrimaryKeyID в (9223372036854775807)« 2. »выберите * из SomeEntity, где SomePrimaryKeyID в (CAST (9223372036854775807 AS BIGINT))» – Lokeshwer

+0

Предполагаю, что без CAST Sql Server выведено, что тип литерала должен быть bigint из-за типа столбца (или он обрабатывает литерал как bigint, потому что он не вписывается в int или оба). В общем, почему актер тебя беспокоит? – Pawel

+0

@pawel литье важно, потому что это приводит к непараметрированному запросу, который может отрицательно сказаться на производительности, потому что каждый запрос получает новый план запроса (и не может быть повторно использован, если только с точно такими же значениями) – Andrew