鉴于我们的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
我们尝试并为Name实现了TypeConverter,但转换器从未被调用过。
有没有办法让linq使用这个ValueTypes?
更新
使用NHibernate.UserTypes.IUserType
它有效。我按照此处所述实现了接口:How to implement correctly IUserType?
我仍然需要将一个ConversionOperator从string添加到Name,并且必须在linq语句中显式调用它,即使它被定义为隐式。
var result = from PersonEntity p in PersonEntity.Queryable
where p.Name == (Name)"Thomas" select p;
return result.First(); //Now works