LINQKit:将LINQ中的可扩展查询嵌套到实体

LINQKit:将LINQ中的可扩展查询嵌套到实体,linq,entity-framework-5,linqkit,Linq,Entity Framework 5,Linqkit,我一直试图合并到一个共享数据访问层,但是,我遇到了一个障碍。使用ExpandableQuery构造嵌套查询时,表达式解析器无法正确展开ExpandableQuery并构造有效的SQL查询。引发的错误为: System.NotSupportedException:无法创建“存储”类型的常量值。在此上下文中仅支持基元类型或枚举类型 通过下面的示例程序,我们可以很容易地重构这个问题,并且它显然与表上的AsExpandable()调用隔离开来 class Program { static voi

我一直试图合并到一个共享数据访问层,但是,我遇到了一个障碍。使用
ExpandableQuery
构造嵌套查询时,表达式解析器无法正确展开
ExpandableQuery
并构造有效的SQL查询。引发的错误为:

System.NotSupportedException:无法创建“存储”类型的常量值。在此上下文中仅支持基元类型或枚举类型

通过下面的示例程序,我们可以很容易地重构这个问题,并且它显然与表上的
AsExpandable()
调用隔离开来

class Program
{
    static void Main(string[] args)
    {
        Database.SetInitializer<MyContext>(null);
        var cs = MY_CONNECTION_STRING;
        var context = new MyContext(cs);

        var table = (IQueryable<Store>)context.Set<Store>();
        var q = table
            .AsExpandable()
            .Select(t => new {Id = t.StoreId, less = table.Where(tt => tt.StoreId > t.StoreId) })
            .Take(1)
            .ToArray();
    }
}

public class MyContext : DbContext
{
    public MyContext(string connection) : base(connection) {}

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Store>();
        base.OnModelCreating(modelBuilder);
    }
}

[Table("stores")]
public class Store
{
    [Key]
    public int StoreId { get; set; }
}
但是,当包含
AsExpandable()
时,实体框架会将整个stores表拉入内存,然后出现“无法创建常量”错误


是否有任何已知的解决方法可以强制LINQKit打开
ExpandableQuery
并在表达式解析器中计算嵌套的子查询?

可以尝试的一件事是使用.AsEnumerable。这将阻止直接转换为SQL,而SQL正是错误的来源

请在主菜单中尝试以下操作:

var table = (IQueryable<Store>)context.Set<Store>();
var q = table
    .AsEnumerable()
    .Select(t => new {Id = t.StoreId, less = table.Where(tt => tt.StoreId > t.StoreId) })
    .Take(1)
    .ToArray();
var table=(IQueryable)context.Set();
var q=表
.可计算的()
.Select(t=>new{Id=t.StoreId,less=table.Where(tt=>tt.StoreId>t.StoreId)})
.采取(1)
.ToArray();

这与Linqkit无关。这是一个EF异常,当您使用一个只允许一个基元值的对象时,您总是会得到它

我认为
tt
是一个
Store
对象。无法将此对象转换为SQL。因此,首先将ID
tt.StoreId
放入一个变量中,并在查询中使用该变量

var table = (IQueryable<Store>)context.Set<Store>();
var q = table
    .AsEnumerable()
    .Select(t => new {Id = t.StoreId, less = table.Where(tt => tt.StoreId > t.StoreId) })
    .Take(1)
    .ToArray();