【问题标题】:Linq query returns the same names even though they should be differentLinq 查询返回相同的名称,即使它们应该不同
【发布时间】:2016-01-30 10:09:18
【问题描述】:

我是 EF6 的新手,我已经设置了 Chinook 数据库并让它与 .NET Framework 4.0 上的 SqlLite .NET 提供程序一起工作。

当我执行以下查询时,它执行没有问题,但轨道名称都是一样的。它们应该是不同的,因为它们具有不同的轨道 ID,并且我查找了这些轨道 ID,它们具有不同的名称。

var result = context.Playlists.Include(p => p.Tracks)
                .Where(p => p.Name == "Brazilian Music")
                .SelectMany(p => p.Tracks);

foreach(var p in result)
{
  Console.WriteLine(p.Playlist.Name + ", " + p.TrackId + ", " + p.Track.Name);
}

感谢任何帮助。

这是我的结果的输出:

控制台输出:

【问题讨论】:

  • 你为什么用Console.WriteLine(p.Playlist.Name + ", " + p.TrackId + ", " + p.Track.Name);而不是Console.WriteLine(p.Playlist.Name + ", " + p.TrackId + ", " + p.Name);?有专栏Track.Track吗?
  • 看起来正确。 ef中的关系是否设置正确?
  • 我想查看从播放列表到曲目的映射。 p.Playlist.Name 和 p.TrackId 没有问题。是 p.Track.name 返回相同的值,即使它们应该不同。
  • 我相信连接表上的关系设置正确。这是一个多对多的关系。但是,如果我使用 join 执行此操作,则效果很好(请参阅下面的答案)

标签: c# sqlite linq-to-entities entity-framework-6


【解决方案1】:

您的实体不正确。 如果播放列表有一个 TrackId,这意味着一个播放列表只能有一个曲目。 您的输出显示您有许多同名的播放列表。 Track 应该有 PlaylistId,但如果不看到实体就很难给出准确的答案。

【讨论】:

  • 只是不好的命名。结果中的p 不是播放列表。据我了解它的 PlaylistTrack
  • 谢尔盖是正确的。这是 SQL 跟踪: SELECT [Extent2].[PlaylistId] AS [PlaylistId], [Extent2].[TrackId] AS [TrackId] FROM [Playlist] AS [Extent1] INNER JOIN [PlaylistTrack] AS [Extent2] ON [Extent1 ].[PlaylistId] = [Extent2].[PlaylistId] WHERE '巴西音乐' = [Extent1].[Name]
【解决方案2】:

好的,我尝试了另一种使用连接表的方法,现在它给出了正确的结果

var result = from p in context.Playlists
             join pt in context.PlaylistTracks on p.PlaylistId equals pt.PlaylistId
             join t in context.Tracks on pt.TrackId equals t.TrackId
             where p.Name == "Brazilian Music"
             select new { PlaylistName = p.Name, TrackId = t.TrackId, TrackName = t.Name };

foreach (var p in result)
{
  Console.WriteLine(p.PlaylistName + ", " + p.TrackId + ", " + p.TrackName);
}

我检查了联结表 POCO,没有发现任何问题。

我仍然不明白为什么第一种方法不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 2014-06-04
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    相关资源
    最近更新 更多