Замок ActiveRecord / NHibernate Linq Querys с типами значений - PullRequest
1 голос
/ 12 мая 2010

Учитывая следующий код для наших Active Record Entites и ValueTypes, Linq не работает для нас.

[ActiveRecord("Person")]
public class PersonEntity : ActiveRecordLinqBase<PersonEntity>
{
  string _name;

  [Property("Name", Length = 20, ColumnType = "string", 
    Access = PropertyAccess.FieldCamelcaseUnderscore)]
  public  Name Name
  {
  get { return NameValue.Create(_name);}
  set { _name = value.DataBaseValue; }
  }
  ...
}

public abstract class Name : IValueType
{
  string DataBaseValue {get;set;}
  ...
}

public class Namevalue : Name
{
  string _name;
  private NameValue(string name) 
  {
    _name = name;
  }
  public static NameValue Create(string name) 
  {
    return new NameValue(name);
  }
  ...
}

Мы пытались использовать linq следующим образом, но безуспешно:

var result = from PersonEntity p in PersonEntity.Queryable 
             where p.Name == "Thomas" select p;
return result.First(); // throws exception Cannot convert string into Name

Мы попробовали и реализовали TypeConverter для Name, но конвертер так и не был вызван.

Есть ли способ заставить linq работать с этим ValueTypes?

Обновление:
Используя NHibernate.UserTypes.IUserType, это работает. Я реализовал интерфейс, как описано здесь: Как правильно реализовать IUserType?

Мне все еще нужно было добавить ConversionOperator из строки в Name и вызвать его явно в операторе linq, хотя он был определен как неявный.

var result = from PersonEntity p in PersonEntity.Queryable 
             where p.Name == (Name)"Thomas" select p;
return result.First();  //Now works
...