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