包含不适用于 LinqKit AsExpandable

Includes doesn't work with LinqKit AsExpandable

我正在尝试在我的 EfCore2.0 项目中使用 LinqKit AsExpandable,我 运行 遇到了 Includes 没有的问题工作。

为了调试它,我从 github 下载了 LinqKit 源代码,并用项目引用替换了我项目中的 Nuget 引用。

在调试 LinqKit 项目时,我注意到我对 Include 的调用没有遇到我在 ExpandableQueryOfClass<T>.Include 上设置的断点。

我做了一些进一步的测试并注意到断点 如果我首先转换为 ExpandableQueryOfClass (这是 [=11 中的内部 class =] 我做了 public,所以如果我引用 Nuget 包,我就不能做转换。

这是 LinqKit 中的错误还是我做错了什么?

这是我的测试代码。

using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;

using Internal.DAL.Db;
using Internal.Models.Customer;

using LinqKit; // Referencing LinqKit.Microsoft.EntityFrameworkCore
using Xunit;

namespace Internal.EntityFramework.Tests
{
    public class UnitTest1
    {
        private DbContextOptionsBuilder<DataContext> _ctxBuilder =>
            new DbContextOptionsBuilder<DataContext>().UseSqlServer(Connection.String);

        [Fact]
        public async Task SuccessTest()
        {
            using (var ctx = new DataContext(_ctxBuilder.Options))
            {
                var query = 
                    (
                        // this cast is the only difference between the methods
                        (ExpandableQueryOfClass<Order>)
                        ctx.Orders
                        .AsExpandable()
                    )
                    .Include(r => r.Customer)
                    .Take(500);

                var responses = await query.ToListAsync();

                // this succeeds
                Assert.All(responses, r => Assert.NotNull(r.Customer));
            }
        }

        [Fact]
        public async Task FailTest()
        {
            using (var ctx = new DataContext(_ctxBuilder.Options))
            {
                var query = ctx.Orders
                    .AsExpandable()
                    .Include(r => r.Customer)
                    .Take(500);

                var responses = await query.ToListAsync();

                // this fails
                Assert.All(responses, r => Assert.NotNull(r.Customer));
            }
        }
    }
}

编辑 2018-05-15:LinqKit github 存储库上有一个 open issue

我不确定这是 LINQKit 还是 EF Core 的错误(肯定不是你的)。

肯定是由 EF Core Include / ThenInclude implementations 引起的,它们都包含对 source.Provider is EntityQueryProvider 的检查,并且在 [=13= 的情况下不执行任何操作].

我不确定 EF Core 设计者的想法是什么——可能是自定义查询提供程序继承自 EntityQueryProvider,但同时 class 是基础架构的一部分并标记为不应该被使用。

我也不知道 LINQKit 计划如何解决这个问题,但正如您所注意到的,当前的实现确实 broken/not 有效。目前它在我看来更像是一个 WIP。

目前我看到的唯一解决方法是在包含之后应用 AsExpandable()