2012-03-15 2 views
3

Я пытаюсь понять вывод NHibernate SQL для этого объекта:NHibernate LINQ BIGINT литья

public class Person 
{ 
    public virtual long Id { get; set; } 
    public virtual long Number { get; set; } 
} 

Когда я пишу:

var maxNumber = s.Query<Person>().Max(p => p.Number); 

Сгенерированный SQL выглядит следующим образом:

select cast(max(person0_.Number) as BIGINT) as col_0_0_ from Person person0_ 

Почему требуется лить, если столбец Number равен bigint в любом случае?

Я использую NHibernate 3.2, SQL Server 2008 R2, отображение определяется следующим образом:

<class name="NhMappingTest.Person, NhMappingTest"> 
     <id name="Id"><generator class="increment" /></id> 
     <property name="Number" /> 
</class> 
+0

То же самое, если вы отбрасываете 'type = 'System.Int64, mscorlib" 'из вашего сопоставления? – Rippo

+0

@Rippo: да, я добавил, что позже, чтобы узнать, не изменит ли это что-либо. Я также создал схему DB, используя NHibernate, прежде чем добавить это, и столбец был создан как «bigint». Кроме того, 'not-null', похоже, не влияет на это. Я упрощу его до первой версии. – Groo

ответ

1

Это не необходимости. Это деталь реализации:

protected HqlTreeNode VisitNhMax(NhMaxExpression expression) 
{ 
    return _hqlTreeBuilder.Cast(
     _hqlTreeBuilder.Max(
      VisitExpression(expression.Expression).AsExpression()), 
      expression.Type); 
} 

Итак, код ослепляет результат.

+0

Хорошо, так как это, скорее всего, не влияет на производительность на стороне сервера, я доволен этим. Я просто хотел проверить, является ли это потенциальной ошибкой, поскольку запрос также не выполнялся в некоторых других аспектах. Спасибо, что нашли время проверить исходный код. – Groo