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

时间:2011-11-01 09:35:28

标签: c# linq-to-sql

我使用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)
           };

这会产生上述错误。如果我将string[]作为另一个参数添加到CompiledQuery,那么我看不出错误。此外,如果我将字符串修改为const而不是static readonly,这也可以,但我想这是由于在编译时分配了值。

有没有办法让static readonly字段正常工作?

2 个答案:

答案 0 :(得分:2)

问题出现了,因为Linq-To-Sql正在尝试将表达式转换为后端SQL,因为逻辑会看到一个未映射的类成员,它无法应对转换它。

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

partial class Order  { 

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

  private static readonly Func<DataContext, Order, bool> _isComplete;

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

}

答案 1 :(得分:0)

如果您没有混合普通查询和编译查询,则没有问题。以下工作将为您提供更好的整体性能,但代价是无法重复使用您喜欢的任何地方编译的简单IsCompleted

public static readonly Func<YourDataContext, IEnumerable<Order>> GetCompletedOrders =
    CompiledQuery.Compile((YourDataContext context) =>
        context.Orders.Where(o => Complete == o.Status));