Учитывая следующий код для наших 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