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(Nullable
1 forMergeOption)在System.Data.Entity.Core.Objects.ObjectQuery1.<>c__DisplayClass3.<GetResults>b__2() at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func
1 func 、IDbExecutionStrategyexecutionStrategy、布尔startLocalTransaction、布尔releaseConnectionOnSuccess)在System.Data.Entity.Core.Objects.ObjectQuery1.<>c__DisplayClass3.<GetResults>b__1() at System.Data.Entity.Core.Objects.ObjectQuery
1.GetResults(Nullable1 forMergeOption) at System.Data.Entity.Core.Objects.ObjectQuery
1..GetEnumerator>b__0()在System.Lazy1.CreateValue() at System.Lazy
1.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 行
使用 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)
归档时间: |
|
查看次数: |
2601 次 |
最近记录: |