实体框架错误-转换为值类型'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.
尝试重写您的查询:
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
}
对于某些结果,子属性将为空,那么显然,通过子属性来获取父属性是行不通的。
我要把它归咎于午餐前的脑屁。