包含不适用于 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()
。
我正在尝试在我的 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()
。