【问题标题】:LINQ query returning null when requesting bytesLINQ 查询在请求字节时返回 null
【发布时间】:2013-01-19 10:18:31
【问题描述】:

我正在尝试使用 MVC 制作可下载的曲目。 这是我的代码:

public ActionResult DownloadTrack(int albumid, int trackid)
    {
        var track = (from x in database.songs
                     where x.ALBUM_ID == albumid &&
                     x.TRACK_ID == trackid
                     select x).First();
        Byte[] Song = track.MP3;
        return File(Song, ".mp3", "test");
    }

当代码到达 Byte[] Song 时,它显示 track.MP3 = null 但是当我查询我的数据库时,它说它已满......

【问题讨论】:

  • 您是否分析了正在生成的查询?
  • 同意@IronMan84 :您应该首先检查您是否获得了预期的轨道(顺便说一句,您应该使用 .FirstOrDefault() 并处理轨道 == null 情况)
  • @IronMan84。我从来没有做过查询分析。这是怎么做的?你能在 SQL Compact Edition 上做到吗?
  • @Lourens MP3 的服务器类型是什么?
  • @Lourens track 上的其他字段是否如您所愿,或者它们也是空的?如果为空,则整个查询可能失败。

标签: c# asp.net-mvc linq


【解决方案1】:

First 运算符返回序列的第一个元素或与谓词匹配的序列的第一个元素,具体取决于使用的原型。

顺便说一句: 如果任何参数为空,则会引发 ArgumentNullException。 如果源序列为空或谓词永远不会返回 true,则会引发 InvalidOperationException。

因此,where 子句中使用的条件很可能不会产生任何结果。

建议如下:

a) 如果您使用的是 MS SQL Server,请使用 SQL Profiler 并确保将正确的 SQL 应用于 DB(从 LINQ 生成的 SQL)

  • 打开 SQL Server Management Studio
  • 转到工具 - SQL Server Profiler
  • 同意打开的“跟踪属性”对话框中的默认值,单击“运行”
  • 运行上述 LINQ 并调查 SQL Profiler 中的 SQL 语句 (可以直接将profiler中的SQL复制粘贴到DB中,运行看看是否 它是否产生所需的结果,如果没有,请修改 LINQ)。

b) 建议使用FirstOrDefault,并处理返回的null

【讨论】:

    猜你喜欢
    • 2018-03-05
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多