【问题标题】:C# NHibernate Substring Method Not Found未找到 C# NHibernate 子字符串方法
【发布时间】:2017-03-08 15:55:40
【问题描述】:

我正在尝试对联系人列表运行查询并使用给定的字符串过滤器过滤它们。代码如下:

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”,因为这将跨越两个部分)。

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

【问题讨论】:

  • 如果您不能使用StartsWithEndsWithContains,您可能需要一个自定义函数来为您将方法调用适配为sql。例如:weblogs.asp.net/ricardoperes/…
  • 检查 IDE 中的数据类型等;在任何情况下,您都需要提供更多信息才能提供适当的解决方案

标签: c# mysql nhibernate


【解决方案1】:

在 lambda 中使用 SubString 是正确的,但对 则不是。您正在使用,避免使用 语法或使用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));

查询结束:

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)));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 2016-10-05
    • 2017-10-21
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    相关资源
    最近更新 更多