实体框架错误-转换为值类型'System.Int64'失败,因为物化值为空

本文关键字:失败 因为 Int64 System 类型 错误 实体 框架 转换 | 更新日期: 2023-09-27 18:06:44

下面的方法在执行ToListAsync()时失败,并出现以下错误

The cast to value type 'System.Int64' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type. 

,

 private IQueryable<MaterialSearchResult> MaterialSearchQuery(string searchTerm)
            {    
                return from m in this.context.GB_Material
                       from v in this.context.WF_VideoVersion
                           .Where(
                               v =>
                                   v.MaterialID == m.MaterialID)
                           .DefaultIfEmpty()
                       select new MaterialSearchResult
                       {
                           MaterialId = v.MaterialID,
                           MaterialName = v.GB_Material.MaterialName,
                           MaterialTitle = v.GB_Material.MaterialTitle,
                           CreatedDate = v.GB_Material.CreatedDate,
                           NearestTxDate = v.NearestTXDate,
                           Channel = v.ScheduleName
                       };
    }

调用方法
public Task<List<MaterialSearchResult>> SearchMaterials(string searchTerm, string sort, string direction, int pageSize = 20, int skip = 0)
    {
        var data = MaterialSearchQuery(searchTerm)
            .SortMaterials(sort,direction)
            .Skip(skip)
            .Take(pageSize);
        return data.ToListAsync();
    }
public class MaterialSearchResult
{
    public long MaterialId { get; set; }
    public string MaterialName { get; set; }
    public string MaterialTitle { get; set; }
    public DateTime? NearestTxDate { get; set; }
    public string Channel { get; set; }
    public DateTime CreatedDate { get; set; }
}
 public class GB_Material()
    {
       public long MaterialID { get; set; }
    public string MaterialName { get; set; }
    public string MaterialTitle { get; set; }
    public System.DateTime CreatedDate { get; set; }
   public virtual ICollection<WF_VideoVersion> WF_VideoVersion { get; set; }
    }
     public class WF_VideoVersion()
    {
         public long VideoVersionID { get; set; }
         public long MaterialID { get; set; }
         public Nullable<System.DateTime> NearestTXDate { get; set; }
         public string ScheduleName { get; set; }
         public virtual GB_Material GB_Material { get; set; }
    }
编辑:

我也得到相同的错误在NearestTxDate属性

The cast to value type 'System.DateTime' failed because the materialized value is null. 

实体框架错误-转换为值类型'System.Int64'失败,因为物化值为空

尝试重写您的查询:

return from m in this.context.GB_Material
                       from v in this.context.WF_VideoVersion
                           .Where(
                               v =>
                                   v.MaterialID == m.MaterialID)
                           .DefaultIfEmpty()
                       select new MaterialSearchResult
                       {
                           MaterialId = m.MaterialID,
                           MaterialName = m.MaterialName,
                           MaterialTitle = m.MaterialTitle,
                           CreatedDate = m.CreatedDate,
                           NearestTxDate = v.NearestTXDate,
                           Channel = v.ScheduleName
                       };

出于某种疯狂的原因,我把select语句写成了这样:

                  select new MaterialSearchResult
                   {
                       MaterialId = v.MaterialID,
                       MaterialName = v.GB_Material.MaterialName,
                       MaterialTitle = v.GB_Material.MaterialTitle,
                       CreatedDate = v.GB_Material.CreatedDate,
                       NearestTxDate = v.NearestTXDate,
                       Channel = v.ScheduleName
                   }

当它应该是这个

 select new MaterialSearchResult
                       {
                           MaterialId = mMaterialID,
                           MaterialName = m.MaterialName,
                           MaterialTitle = m.MaterialTitle,
                           CreatedDate = m.CreatedDate,
                           NearestTxDate = v.NearestTXDate,
                           Channel = v.ScheduleName
                       }

对于某些结果,子属性将为空,那么显然,通过子属性来获取父属性是行不通的。

我要把它归咎于午餐前的脑屁。

相关文章: