5

Tôi đang cố gắng sử dụng hàm SQL CONSTAINS để lọc một số dữ liệu trên API QueryOver.Cách sử dụng Tìm kiếm Toàn văn cho bất kỳ thuộc tính nào có API QueryOver

Vấn đề chính là tôi không thể sử dụng SqlFunction trong mệnh đề where, nó không biên dịch, vì cần ICriterion.

var result = Session.QueryOver<Individual>() 
    .Where(Projections.SqlFunction(
     "FullTextContains", NHibernateUtil.Boolean, 
     Projections.Property<Individual>(x => x.LastName), 
     Projections.Constant("something"))) 
     .List(); 

Tôi cố gắng để phù hợp với nó để một hằng số TRUE, nhưng khi truy vấn được thực hiện nó tạo ra lỗi cú pháp, vì CONSTAINS chức năng không thể được sử dụng với bằng toán tử.

var result = Session.QueryOver<Individual>() 
    .Where(Restrictions.Eq(Projections.SqlFunction(
     "FullTextContains", NHibernateUtil.Boolean, 
     Projections.Property<Individual>(p => p.LastName), 
     Projections.Constant("something")), true)) 
     .List(); 

Làm thế nào tôi có thể sử dụng một hàm boolean sql trực tiếp tại nơi biểu hiện trên QueryOver API?

Trả lời

3

Đây là cách tôi tìm thấy làm thế nào để sử dụng nó:

var projection = Projections.SqlFunction("FullTextContains", 
    NHibernateUtil.Boolean, 
    Projections.Property<Individual>(x => x.LastName), 
    Projections.Constant("something")); 

var result = Session.QueryOver<Individual>() 
    .Where(new ProjectionAsCriterion(projection)) 
    .List(); 

Để sử dụng một IProjection như một ICriterion i tạo thực hiện riêng của tôi dựa trên SimpleExpression lớp từ dự án NHibernate.

public class ProjectionAsCriterion : AbstractCriterion 
{ 
    private readonly IProjection _projection; 

    public ProjectionAsCriterion(IProjection projection) 
    { 
     _projection = projection; 
    } 

    public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, 
     IDictionary<string, IFilter> enabledFilters) 
    { 
     var columnNames = CriterionUtil.GetColumnNamesForSimpleExpression(
      null, _projection, criteriaQuery, criteria, enabledFilters, this, string.Empty); 

     var sqlBuilder = new SqlStringBuilder(4 * columnNames.Length); 

     for (int i = 0; i < columnNames.Length; i++) 
     { 
      if (i > 0) 
      { 
       sqlBuilder.Add(" and "); 
      } 

      sqlBuilder.Add(columnNames[i]); 
     } 
     return sqlBuilder.ToSqlString(); 
    } 

    public override TypedValue[] GetTypedValues(ICriteria criteria, ICriteriaQuery criteriaQuery) 
    { 
     var typedValues = new List<TypedValue>(); 

     if (_projection != null) 
     { 
      typedValues.AddRange(_projection.GetTypedValues(criteria, criteriaQuery)); 
     } 
     typedValues.Add(GetParameterTypedValue(criteria, criteriaQuery)); 

     return typedValues.ToArray(); 
    } 

    private TypedValue GetParameterTypedValue(ICriteria criteria, ICriteriaQuery criteriaQuery) 
    { 
     return CriterionUtil.GetTypedValues(criteriaQuery, criteria, _projection, null).Single(); 
    } 

    public override IProjection[] GetProjections() 
    { 
     return new[] { _projection }; 
    } 

    public override string ToString() 
    { 
     return _projection.ToString(); 
    } 
} 
Các vấn đề liên quan