当前位置: 首页 > 编程语言 > C#

如果第一列为空,实体框架为该行返回null分享

时间:2023-04-10 18:55:24 C#

如果第一列为空,实体框架为该行返回null在模型中可以看到行为。我有一个看起来像这样的查询:varrows=(fromalarmincontext.Alarmsjointempincontext.ListDetailsonalarm.ListDetailIdequalstemp.ListDetailIdintoentriesfromentryinentries.DefaultIfEmpty()joinreadincontext.Readsonalarm.ReadIdequalsread.ReadIdjoinplateincontext.Imagesonalarm.ReadIdequalsplate.ReadIdwherealarm.IActive==1&&!alarm.TransmittedAlarmwhereread.IActive==1whereplate.IActive==1&&plate.ImageTypeId==2selectnew{alarm,entry,read,plate}).ToArray();此查询按列名的字母顺序返回所有列。事实证明,对于结果集中的几行,此列为NULL。当我在调试器中展开行变量时,我看到整行都是空的!编辑:一些澄清。“第一列”,我指的是第一行的第一列,即“SELECTA,B,CFROM...”,我指的是A。实际上,实体框架构建的查询返回所有连接结果中的列该集合按字母顺序排序,第一个字母可以为空,某些行为空。有问题的列不是主键;如果是,则不能为空。当EntityFramework将返回的数据行作为对象处理时,它会查看每行中第一列的值。如果该列为null,则为该行返回null,而不是将与该列对应的属性设置为null的对象。我不认为这与左外连接有任何关系;只是我的查询使用了一个。但是,我还没有进行任何测试来验证这一点,所以这只是一个假设。有没有人见过这个?有人有解决方法吗?Tony我可以确认我遇到了同样的问题:当EF形成的SQL查询在结果的第一列中有null时,它返回null而不是实体。这意味着完全如下:using(vardc=newMyDbContext()){varq=dc.Lands;//地是DbSetq=q.Where(criteria);//这导致SQL查询在第一列中返回null,由探查器确认vart=q.Single();//t现在是null}如果我们采用另一个不会在第一列中导致null条件的实体,则t是一个正常的非null实体。在我看来,它像是EF中的某种模糊行为/错误。更新经过数小时的探索,我发现了以下行为。EF确实为结果第一列中具有NULL的实体返回null(这打破了预期的行为),但它有几个关于将哪一列放在选择列表中的第一位的概念。因此,在使我的模型与我的数据库状态完全相同之后(意味着表示所有NULLABLE数据库列并将所需的导航属性替换为可选属性)-我使用代码优先,所以有很多地方需要明确数据库-我设法使它工作。这意味着您应该使用数据库检查模型的商店级定义(取决于您使用的范例,基于设计器还是基于代码,这将是不同的地方)。您在连接中使用DefaultIfEmpty。这意味着如果条目中没有匹配连接条件的条目(alarm.ListDetailId等于temp.ListDetailId),我希望您将ListDetail类型的默认值(为null)放入条目中。在这种情况下,EF生成LEFTJOIN。实际上,这段代码是使用Linq2Sql或EF生成LEFTJOIN的众所周知的方法。如果表中没有行符合JOIN条件,则LEFTJOIN语句为表的所有列选择NULL值。实际上,唯一重要的列是实体的PK列。EF检查PK值是否为NULL,确定实体不存在并将null放入条目中。然后将此null作为结果的条目属性值传递。以上是C#学习教程:如果该行第一列为空,则实体框架对该行返回null。所有分享的内容,如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: