Nhibernate和XML字段上的语句一样

时间:2015-03-05 09:27:11

标签: nhibernate

我有一个包装流畅的nhibernate框架,我正在重复使用,并且无法控制实际的映射。

在我的实体对象中,我有一个属性映射为sql中的XML列的字符串。

因此当我运行如下的查询时:

var myResult = (from myTable in DataManager.Session.Query<Table>()
                      where myTable.thatXmlFieldWhichIsMappedAsString.Contains(AnXmlSnippet))
                      select myTable).FirstOrDefault();

尝试在SQL中使用LIKE运算符,该运算符对该列类型无效。

如何在不必选择所有行并首先转换为List的情况下解决这个问题?

1 个答案:

答案 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[]{}
   );