我试图在联系人列表上运行查询,并使用给定的String过滤器对其进行过滤。代码如下:

var query = Session.QueryOver<CrmContact>()
                .Where(x => x.Account.ID == account.ID && x.IsActive && x.IsContact);

query.And(Restrictions.Disjunction()
  .Add(Restrictions.InsensitiveLike(Projections.Property<CrmContact>(c => c.FirstName), filtString, MatchMode.Anywhere))
  .Add(Restrictions.InsensitiveLike(Projections.Property<CrmContact>(c => c.LastName), filtString, MatchMode.Anywhere))
  .Add(Restrictions.InsensitiveLike(Projections.Property<CrmContact>(c => c.Email), filtString, MatchMode.Anywhere))
  .Add(Restrictions.InsensitiveLike(Projections.Property<CrmContact>(c => c.Company), filtString))
  .Add(Restrictions.InsensitiveLike(Projections.Property<CrmContact>(c => c.Phone.Substring(0, 3)), filtString, MatchMode.Anywhere))
  .Add(Restrictions.InsensitiveLike(Projections.Property<CrmContact>(c => c.Phone.Substring(3, 3)), filtString, MatchMode.Anywhere))
  .Add(Restrictions.InsensitiveLike(Projections.Property<CrmContact>(c => c.Phone.Substring(6, 4)), filtString, MatchMode.Anywhere)));


但是,我在运行最后3条语句时遇到问题,因为在运行它们时出现“找不到方法子字符串”错误。如果过滤器是一个电话号码/一个电话号码的一部分,我正在使用子字符串尝试匹配一个电话号码的各个部分(例如,“ 123”将匹配“ 1234567890”,但不匹配“ 0123456789”,因为这将跨越两个部分)。

任何帮助,将不胜感激,谢谢。

最佳答案

在lambda中使用SubString正确使用linq-to-nhibernate,但不适用于queryover。您正在使用queryover,避免使用linq-to-nhibernate语法或使用Linq而不是QueryOver。

Linq(Contains==的区分大小写取决于您的数据库,如果您的数据库已经不区分大小写,则可以删除ToUpper调用):

using System.Linq;
using NHibernate.Linq;

// ...

filtString = filtString.ToUpper();
var query = Session.Query<CrmContact>()
    .Where(x => x.Account.ID == account.ID && x.IsActive && x.IsContact)
    .Where(c => c.FirstName.ToUpper().Contains(filtString) ||
        c.LastName.ToUpper().Contains(filtString) ||
        c.Email.ToUpper().Contains(filtString) ||
        c.Company.ToUpper() == filtString ||
        c.Phone.ToUpper().Substring(0, 3).Contains(filtString) ||
        c.Phone.ToUpper().Substring(3, 3).Contains(filtString) ||
        c.Phone.ToUpper().Substring(6, 4).Contains(filtString));


QueryOver:

var query = Session.QueryOver<CrmContact>()
    .Where(x => x.Account.ID == account.ID && x.IsActive && x.IsContact);

query.And(Restrictions.Disjunction()
   .Add(Restrictions.InsensitiveLike(Projections.Property<CrmContact>(c => c.FirstName),
        filtString, MatchMode.Anywhere))
   .Add(Restrictions.InsensitiveLike(Projections.Property<CrmContact>(c => c.LastName),
        filtString, MatchMode.Anywhere))
   .Add(Restrictions.InsensitiveLike(Projections.Property<CrmContact>(c => c.Email),
        filtString, MatchMode.Anywhere))
   .Add(Restrictions.InsensitiveLike(Projections.Property<CrmContact>(c => c.Company),
        filtString))
   .Add(Restrictions.InsensitiveLike(
        Projections.SqlFunction("substring", NHibernateUtil.String,
            Projections.Property<DimServicePoint>(c => c.Phone),
            Projections.Constant(0), Projections.Constant(3)),
        filtString, MatchMode.Anywhere))
   .Add(Restrictions.InsensitiveLike(
        Projections.SqlFunction("substring", NHibernateUtil.String,
            Projections.Property<DimServicePoint>(c => c.Phone),
            Projections.Constant(3), Projections.Constant(3)),
        filtString, MatchMode.Anywhere))
   .Add(Restrictions.InsensitiveLike(
        Projections.SqlFunction("substring", NHibernateUtil.String,
            Projections.Property<DimServicePoint>(c => c.Phone),
            Projections.Constant(6), Projections.Constant(4)),
        filtString, MatchMode.Anywhere)));

关于c# - 找不到C#NHibernate子串方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42675997/

10-11 23:59
查看更多