Linq для NHibernate возвращает результаты, отличные от HQL? - PullRequest
3 голосов
/ 04 марта 2010

У меня есть базовая настройка сущности:

public class Instrument
{
    public virtual int Id { get; set; }
    public virtual Guid? InstrumentGuid { get; set; }
    public virtual string FIPSCode { get; set; }
    public virtual IList Names {get; set;}
}

public class Name
{
    public virtual int Id {get; set;}
    public virtual string Name {get; set;}
    public virtual Instrument Instrument {get; set;}
}

Отображения:

public class InstrumentMap: ClassMap<Instrument>
{
    public InstrumentMap()
    {
        Id(x => x.Id);
        Map(x => x.InstrumentGuid).Not.Nullable();
        Map(x => x.FIPSCode).Not.Nullable();
        HasMany(x => x.Names).Casecade.All;
    }
}

public class NameMap : ClassMap<Name>
{
    public NameMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        References(x => x.Instrument);
    }
}

Так почему же, когда я выполняю эти два запроса, я получаю разные результаты?

var namelist = from name in Session.Linq()
    where name.Instrument.Id == 1
    select name;

Я получаю 3 результата, 2 где Instrument.Id = 1 и 1, где Instrument.Id = 4 против:

var querystr = "select name From Name as name where name.Instrument.Id = 1";
var hqlresult = Session.CreateQuery(querystr).List();

Это дает только 2 результата, где Instrument.Id = 1.

Может ли кто-нибудь объяснить, откуда происходит Id = 4 в запросе Linq, или NHibernate.Linq еще не совсем стабилен? Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 марта 2010

Я включил ShowSql на провайдере Sqllite (который я использую для тестирования) и обнаружил, что он создает совместимый код для каждого выбора.

По какой-то причине только поставщик Linq (и с синтаксисом 2.0, и с 3.0 оставляет последний элемент в хранилище, который не является частью запроса sql. Я воссоздал SQL через sqlite3.exe и вывод между было то же самое. О, и это происходит только для полей Id. Когда я ссылался на другое поле (guid) и использовал его для предложения where = результаты были точными между Linq и HQL!

Так что ответ таков: я не верю, и это ошибка. Спасибо за всю помощь - и когда у меня будет возможность, я попробую нового провайдера, но сейчас не могу на бета-версии нашего продукта.

0 голосов
/ 04 марта 2010

Это похоже на ошибку в используемом вами провайдере linq. Поставщик linq, который вы используете, взят из NHibernate.Contrib. Этот провайдер основан на критериях API. Этот API может генерировать другой SQL, чем HQL. Что такое sql, созданный обоими запросами?

В транке NHibernate есть новый поставщик linq, основанный на hql. Этот поставщик linq будет генерировать тот же sql, что и hql. Я перешел от старого к новому провайдеру в приложении, над которым я сейчас работаю. Он кажется более функциональным, чем старый, но все еще не завершен.

...