我有一个包装流畅的nhibernate框架,我正在重复使用,并且无法控制实际的映射。
在我的实体对象中,我有一个属性映射为sql中的XML列的字符串。
因此当我运行如下的查询时:
var myResult = (from myTable in DataManager.Session.Query<Table>()
where myTable.thatXmlFieldWhichIsMappedAsString.Contains(AnXmlSnippet))
select myTable).FirstOrDefault();
尝试在SQL中使用LIKE运算符,该运算符对该列类型无效。
如何在不必选择所有行并首先转换为List的情况下解决这个问题?
答案 0 :(得分:2)
如果我们不需要.Query()(LINQ),我们可以使用Criteria
查询或QueryOver
,我们可以使用转换:
// the projection of the column with xml
// casted to nvarchar
var projection = Projections
.Cast(NHibernateUtil.StringClob
, Projections.Property("thatXmlFieldWhichIsMappedAsString"));
// criteria filtering with LIKE
var criteria = Restrictions.Like(projection, "searched xml");
// query and result
var query = session.QueryOver<MyEntity>()
.Where(criteria)
;
var result = query
.SingleOrDefault<MyEntity>()
;
根据我的经验,这可能导致转换为小nvarchar(255) - sql server ...然后我们可以这样做:
var projection = Projections
.SqlProjection("CAST(thatXmlFieldWhichIsMappedAsString as nvarchar(max)) AS str"
, new string[]{}
, new NHibernate.Type.IType[]{}
);