2014-01-17 3 views
1

В настоящее время я делаю следующее, чтобы получить идентификатор сохраненного объекта в БДЕ, которые соответствуют некоторым полям сущности MyObjectПолучить Id из БДА с помощью Ровного/GetHashCode в тех случаях, когда положение

MyObject contract = new MyObject(some parameters); 

Session.Query<MyObject>().Where(x=>x.Field1==contract.Field1 && x.Field2==contract.Field2 ....).FirstOrDefault(); 

Я ищу бы взять прибыль из того, что равноправный и GetHashCode будут перезаписаны, чтобы сделать это следующим образом:

Session.Query<MyObject>().Where(x=>x.Equal(contract)).FirstOrDefault(); 

Но это не работает. Есть ли какой-нибудь способ избежать повторного ввода всех полей сравнения в предложение Where? Я нахожу это уродливым!

Большое спасибо

ответ

1

Ответ довольно прост и прямолинейный: это разные понятия.

Equals и GetHashCode являются C# (приложение, бизнес) способ, как отличить объекты выполнения. Это оператор и неадекватное значение ... оба из них не сохраняется.

NHibernate не знает, что следует сравнивать с уровнем БД.

Но что более интересно в приведенном выше фрагменте кода эта часть:

MyObject contract = new MyObject(some parameters); 

В некоторые параметры может означать две вещи: 1) идентификатор или 2) динамические поисковые фильтры.

В первом случае мы должны получить прибыль сформировать surrogated ключей/ID:

Session.Get<MyObject>(id); 

Во втором, мы, скорее всего (рано или поздно обязательно) быть снабжен меняющимся набором значений. И тогда мы можем применять их динамически.

Наконец, случай, который вы, скорее всего, ищете, - это некоторый GetByCode или GetByName. Я хотел бы сказать, что метод реализации как этот

public virtual MyObject GetByCode(string code) 
{ 
    var result = Session 
     .Query<MyObject>() 
     .Where(x => x.Code == code) 
     .FirstOrDefault(); 

    return result; 
} 

будет НЕ сделать ваш код грязный. Фактически, этот метод может быть на уровне данных. Таким образом, он может иметь более поздние настройки (фильтры по языку пользователя ... и т. Д.). В то время как Equals и GetHashCode относятся к объекту (по возможности, POCO) и не должны быть , поэтому динамические.

+0

Да, я понимаю, что он не может перевести Equal в SQL. Затем вы прекрасно ответили, что я неявно спрашиваю, факт, что метод реализации, который вы отправили, не сделает мой код грязным и может быть слоем данных. Большое спасибо. – user3091460

+0

Точно! именно вы поняли, как я пытался вам предложить ... «GetByCode» - довольно подходящее решение для этих (очень распространенных) сценариев. Удачи в NHibernate;) –

0

Вы не можете использовать метод Equals, потому что Linq не может перевести его в SQL-запрос для вашего объекта.

 Смежные вопросы

  • Нет связанных вопросов^_^