【问题标题】:how to translate method call into lambda expression如何将方法调用转换为 lambda 表达式
【发布时间】:2017-10-25 14:21:16
【问题描述】:

我对 LinqToSql 方法有疑问。

型号:

public class Person
{
    public int ID { get; set; }
    public string LastName { get; set; }
    public Phone Phone { get; set; }
}

public class Phone
{
    public int ID { get; set; }
    public string Number { get; set; }

    public bool IsUkr()
    {
        return this.Number.StartsWith("380");
    }
}

我使用 Nhibernate 作为 ORM,我想执行

IQueryable<Phone> phones = session.Query<Phone>().Where(x => x.IsUkr());

但 Nhibernate 无法将此表达式转换为 sql,因为它不知道方法 IsUkr()。

解决方案是为 IQueryable 接口编写一些包装器并使用:

session.Query<Phone>().ToExpandable().Where ....

但我不明白如何将 LambdaExpression x => x.IsUkr() 翻译成
x => x.Number.StartsWith("380")

有人可以帮我吗?

【问题讨论】:

  • 如果这是例行检查,您可以考虑将其作为数据库表中的计算属性。
  • @GertArnold 感谢您的想法。但是对于模型中的其他属性有很多这样的条件,所以这种方法不是很好
  • 我不确定你在找什么,但你可以看看stackoverflow.com/a/26922208/1486443

标签: linq nhibernate linq-to-sql


【解决方案1】:

看看这个答案:https://stackoverflow.com/a/13679572/5126411

IsUkr 标准是特定于 Phone 实体的,因此您可以像这样添加一个静态方法:

public static Expression<Func<Phone, bool>> IsUkr = x => x.Number.StartsWith("380");

并使用它:

IQueryable<Phone> phones = session.Query<Phone>().Where(Phone.IsUkr);

也许为这些方法/属性创建一个特殊的静态类会更好。

【讨论】:

  • 这是个好主意,而且有效。但我想知道是否可以在运行时创建这样的表达式
猜你喜欢
  • 1970-01-01
  • 2016-10-11
  • 2013-04-24
  • 2017-05-02
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
相关资源
最近更新 更多