微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – LINQ-SQL – 在CompiledQuery.Compile中使用静态只读字段?

我使用CompiledQuery.Compile遇到了一个奇怪的问题.当尝试在查询中使用静态只读字段时,我收到以下错误消息:

Class member X is unmapped

如果我将字段decleration从partial类移到另一个与LINQ-sql无关的类中,那么我得到以下内容

Object reference not set to an instance of an object

如果我将字段作为参数传递,那么我看到没有错误,查询工作正常并生成预期的sql.

一个例子如下:

partial class Order 
{
    public static readonly string Complete = "Complete";
    public static readonly string Pending = "Pending";

    public static readonly Func<DataContext,Order,bool> IsComplete =
        CompiledQuery.Compile((DataContext context,Order o) =>
           Complete == o.Status);
}

用法

var test = from o in db.Orders
           select new
           {
               IsComplete = Order.IsComplete(db,o)
           };

这会产生上述错误.如果我将一个字符串[]作为另一个参数添加到CompiledQuery,那么我看到没有错误.此外,如果我将字符串修改为const而不是静态只读,这也可以,但我想这是由于在编译时分配的值.

有没有办法让静态只读字段工作?

解决方法

问题出现了,因为Linq-To-sql正试图将你的表达式转换为后端sql,因为逻辑看到一个未映射的类成员,它无法应对转换它.

我建议你创建一个包装属性来为你完成工作

partial class Order  { 

  public static readonly string Complete = "Complete"; 
  public static readonly string Pending = "Pending"; 

  private static readonly Func<DataContext,bool> _isComplete;

  public static Func<DataContext,bool> IsComplete {
    get {
      if (_isComplete == null) {
        var complete=Complete; 
        _isComplete CompiledQuery.Compile((DataContext context,Order o) => 
                                                       complete == o.Status); 
      }
      return _isComplete;
    }
  }
}

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐