嗨我有两张这样的桌子:
public class TableA
{
public int IdTableA { get; set; }
public string OtherInfo { get; set; }
public int? IdTableB { get; set; }
public TableB TableB { get; set; }
}
public class TableB
{
public TableB()
{
TableAs = new HashSet<TableA>();
}
public int IdTableB { get; set; }
public string Description { get; set; }
public ICollection<TableA> TableAs { get; set; }
}
表TableA
到TableB
中的外键映射是这样的:
this.HasOptional(t => t.TableB)
.WithMany(t => t.TableAs)
.HasForeignKey(d => d.IdTableB);
现在我尝试从TableA
中选择一些数据:
context
.TableA
.Select(s => new TableA_DTO
{
IdTableA = s.IdTableA,
OtherInfo = s.OtherInfo,
IdTableB = s.IdTableB,
TableB = new TableB_DTO
{
IdTableB = s.TableB.IdTableB,
Description = s.TableB.Description
}
}).ToList();
当我在TableA
中有一行IdTableB
= null时出现问题。我得到了这个例外:
演员价值类型&#39; Int32&#39;失败,因为具体化值为null。结果类型的通用参数或查询必须使用可空类型。
如何使用实体框架选择此信息?
答案 0 :(得分:1)
您需要空检查:
context
.TableA
.Select(s => new TableA_DTO
{
IdTableA = s.IdTableA,
OtherInfo = s.OtherInfo,
IdTableB = s.IdTableB,
TableB = new TableB_DTO
{
IdTableB = (s.TableB != null) ? s.TableB.IdTableB : null,
Description = (s.TableB != null) ? s.TableB.Description : null
}
}).ToList();
或者可能:
TableB = s.TableB != null
? new TableB_DTO
{
IdTableB = (s.TableB != null) ? s.TableB.IdTableB : null,
Description = (s.TableB != null) ? s.TableB.Description : null
}
: null
编辑:根据以下评论,该错误是因为上下文或SQL不知道TableA_DTO。您需要做的是首先有效地获得结果集:
var data = context.TableA.Include("TableB").ToList(); 'ToList executes
然后,选择此项并转换为所需类型:
//This is a LINQ to Objects operation now, which can do any kind of data transformation
var results = data.Select(s => new TableA_DTO { ... });
这将有效,但您必须确保您未通过实体框架在以下迭代中检索相关数据而进入选择N + 1场景。