使用 Sqlite.NET 的实体框架抱怨不支持 APPLY 连接

sup*_*y71 5 c# linq sqlite entity-framework

我在使用 Sqlite.NET 和 Entity Framework 执行以下 join 语句时遇到问题。

我的设置是:

.NET Framework v4 Entity Framework v6.0.0.0 SQLite.EF6 v1.0.99.0 SQLite.Linq v1.0.99.0

using (var me = new ChinookContext())
{
    var screenset =
        from track in me.Tracks
        join genre in me.Genres on track.GenreId equals genre.GenreId
        join artist in me.Artists on track.Album.ArtistId equals artist.ArtistId
        into artists
        from artist in artists.DefaultIfEmpty()
        select new TrackDTO
        {
            TrackId = track.TrackId,
            TrackName = track.Name,
            GenreId = genre.GenreId,
            GenreName = genre.Name,
            ArtistId = artist.ArtistId,
            ArtistName = artist.Name
        };
        foreach (var track in screenset)
        {
            Console.WriteLine(track.TrackId + ", " + track.TrackName + ", " + track.TrackPrice);
        }
}
Run Code Online (Sandbox Code Playgroud)

我收到的错误是:

不支持 APPLY 联接

这是我在不查看堆栈跟踪的情况下所能获得的最内在的信息。

数据模型基于开源 Chinook 数据库。

奇努克数据模型

有趣的是,我在其他 Sqlite.NET 查询中使用过 join 语句,而且之前没有遇到过任何问题。

任何帮助表示赞赏。

提前致谢。

更新:

这是错误和堆栈跟踪:

准备命令定义时发生错误。有关详细信息,请参阅内部异常。System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition..ctor(DbProviderFactory storeProviderFactory, DbCommandTree commandTree, DbInterceptionContext拦截Context, IDbDependencyResolver解析器, BridgeDataReaderFactorybridgeDataReaderFactory, ColumnMapFactory columnMapFactory) 不支持APPLY联接。 .Data.Entity.Core.EntityClient.Internal.EntityProviderServices.CreateDbCommandDefinition(DbProviderManifestproviderManifest,DbCommandTree commandTree,DbInterceptionContext拦截Context)在System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlanFactory.CreateCommandDefinition(ObjectContext上下文,DbQueryCommandTree树)在System. Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlanFactory.Prepare(ObjectContext上下文,DbQueryCommandTree树,类型elementType,MergeOption mergeOption,布尔流,Span span,IEnumerable 1 compiledQueryParameters, AliasGenerator aliasGenerator) at System.Data.Entity.Core.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable1 forMergeOption)在System.Data.Entity.Core.Objects.ObjectQuery 1.<>c__DisplayClass3.<GetResults>b__2() at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func1 func 、IDbExecutionStrategyexecutionStrategy、布尔startLocalTransaction、布尔releaseConnectionOnSuccess)在System.Data.Entity.Core.Objects.ObjectQuery 1.<>c__DisplayClass3.<GetResults>b__1() at System.Data.Entity.Core.Objects.ObjectQuery1.GetResults(Nullable 1 forMergeOption) at System.Data.Entity.Core.Objects.ObjectQuery1..GetEnumerator>b__0()在System.Lazy 1.CreateValue() at System.Lazy1.LazyInitValue()在System.Data.Entity D:\Dev\Showcase\ServerSqlLite\Xxx\Qxx.cs 中 SqlLiteChinook.Qxx.SearchMusic() 处的 .Internal.LazyEnumerator`1.MoveNext():D 中 SqlLiteChinook.Program.Main(String[] args) 处的第 36 行:\Dev\Showcase\ServerSqlLite\ProgramServer.cs:第 28 行

Nag*_* Hs 1

使用 Lambda 表达式,以下查询将有助于给出所需的结果。

由于表之间存在良好的关系,因此您始终可以使用 .Include 方法来包含子表的所有行。

在下面的查询中,我已经完成了父表专辑和曲目之间的连接。专辑和曲目将分别包括其子表艺术家和流派。

var query3 = db.Albums.Include("Artists").Join(db.Tracks.Include("Genre"), aa => aa.TrackId, tr => tr.ID, (aa, tr) => new
            {
                aa,
                tr
            }).Select(Finalrow => new TrackDTO
            {
                TrackId = Finalrow.tr.ID,
                TrackName = Finalrow.tr.Name,
                GenreId = Finalrow.tr.GENREs.Select(g => g.ID).FirstOrDefault(),
                GenreName = Finalrow.tr.GENREs.Select(g => g.Name).FirstOrDefault(),
                ArtistId = Finalrow.aa.Artists.Select(a => a.Id).FirstOrDefault(),
                ArtistName = Finalrow.aa.Artists.Select(a => a.Name).FirstOrDefault()

            }).OrderBy(t => t.TrackId);
Run Code Online (Sandbox Code Playgroud)