Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 如何修复Linq中返回Null的FirstOrDefault_Entity Framework_Linq_Entity Framework 6 - Fatal编程技术网

Entity framework 如何修复Linq中返回Null的FirstOrDefault

Entity framework 如何修复Linq中返回Null的FirstOrDefault,entity-framework,linq,entity-framework-6,Entity Framework,Linq,Entity Framework 6,我的Linq查询在FirstOrDefault上不断返回null错误 The cast to value type 'System.Int32' failed because the materialized value is null 因为它在ClinicalReading表的ClinicalASETID上找不到任何匹配的记录,这很公平 但是,如果表中没有匹配的条目,我希望“详细信息”页面中的字段显示为空 但是,在使用orderby函数时,如何处理null问题 当前代码: var Clin

我的Linq查询在FirstOrDefault上不断返回null错误

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

因为它在ClinicalReading表的ClinicalASETID上找不到任何匹配的记录,这很公平

但是,如果表中没有匹配的条目,我希望“详细信息”页面中的字段显示为空

但是,在使用orderby函数时,如何处理null问题

当前代码:

var ClinicalASSPATINCVM = (from s in db.ClinicalAssets
                           join cp in db.ClinicalPATs on s.ClinicalAssetID equals cp.ClinicalAssetID into AP
                           from subASSPAT in AP.DefaultIfEmpty()
                           join ci in db.ClinicalINSs on s.ClinicalAssetID equals ci.ClinicalAssetID into AI
                           from subASSINC in AI.DefaultIfEmpty()
                           join co in db.ClinicalReadings on s.ClinicalAssetID equals co.ClinicalAssetID into AR
                           let subASSRED = AR.OrderByDescending(subASSRED => subASSRED.MeterReadingDone).FirstOrDefault()


                           select new ClinicalASSPATINCVM
                           {
                                ClinicalAssetID = s.ClinicalAssetID,
                                AssetTypeName = s.AssetTypeName,
                                ProductName = s.ProductName,
                                ModelName = s.ModelName,
                                SupplierName = s.SupplierName,
                                ManufacturerName = s.ManufacturerName,
                                SerialNo = s.SerialNo,
                                PurchaseDate = s.PurchaseDate,
                                PoNo = s.PoNo,
                                Costing = s.Costing,
                                TeamName = s.TeamName,
                                StaffName = s.StaffName,
                                WarrantyEndDate = subASSPAT.WarrantyEndDate,
                                InspectionDate = subASSPAT.InspectionDate,
                                InspectionOutcomeResult = subASSPAT.InspectionOutcomeResult,
                                InspectionDocumnets = subASSPAT.InspectionDocumnets,
                                LastTypeofInspection = subASSINC.LastTypeofInspection,
                                NextInspectionDate = subASSINC.NextInspectionDate,
                                NextInspectionType = subASSINC.NextInspectionType,
                                MeterReadingDone = subASSRED.MeterReadingDone,
                                MeterReadingDue = subASSRED.MeterReadingDue,
                                MeterReading = subASSRED.MeterReading,
                                MeterUnitsUsed = subASSRED.MeterUnitsUsed,
                                FilterReplaced = subASSRED.FilterReplaced


                                }).FirstOrDefault(x => x.ClinicalAssetID == id);

试过了,但没用


.DefaultIfEmpty(new ClinicalASSPATINCVM())
                .FirstOrDefault()
错误是:

CS1929  'IOrderedEnumerable<ClinicalReading>' does not contain a definition for 'DefaultIfEmpty' and the best extension method overload 'Queryable.DefaultIfEmpty<ClinicalASSPATINCVM>(IQueryable<ClinicalASSPATINCVM>, ClinicalASSPATINCVM)' requires a receiver of type 'IQueryable<ClinicalASSPATINCVM>' 

错误:

CS0173  Type of conditional expression cannot be determined because there is no implicit conversion between 'System.DateTime?' and 'string'

您的问题是因为您的DefaultIfEmpty是以可查询的方式执行的。执行它
AsEnumerable
,它将工作:

// create the default element only once!
static readonly ClinicalAssPatInVcm defaultElement = new ClinicalAssPatInVcm ();

var result = <my big linq query>
    .Where(x => x.ClinicalAssetID == id)
    .AsEnumerable()
    .DefaultIfEmpty(defaultElement)
    .FirstOrDefault();
//只创建一次默认元素!
静态只读ClinicalAspationVcm defaultElement=新的ClinicalAspationVcm();
var结果=
.Where(x=>x.setid==id)
.可计算的()
.DefaultIfEmpty(defaultElement)
.FirstOrDefault();
这不会导致性能损失

数据库管理系统在选择数据方面进行了极大的优化。数据库查询中较慢的部分之一是将所选数据传输到本地进程。因此,让DBMS进行大部分选择是明智的,并且只有在您知道您只有真正计划使用的数据之后,才能将数据移动到本地进程

在您的情况下,您最多需要DBMS中的一个元素,如果没有,您希望使用默认对象

AsQueryable
将以智能方式将所选数据移动到本地进程,可能是每一页所选数据

页面大小是一个很好的折衷方案:不要太小,这样你就不必经常要求下一页;不要太大,这样你就不会转移比实际使用更多的物品

此外,由于
Where
语句,您最多需要一个元素。因此,获取完整的“页面”是没有问题的,页面将只包含一个元素

获取页面后,
DefaultIfEmpty
检查页面是否为空,如果为空,则返回包含
defaultElement
的序列。如果不是,则返回完整的页面


在DefaultIfEmpty之后,您只接受第一个元素,这是您想要的。

您的问题在于,您的DefaultIfEmpty是作为Queryable执行的。执行它
AsEnumerable
,它将工作:

// create the default element only once!
static readonly ClinicalAssPatInVcm defaultElement = new ClinicalAssPatInVcm ();

var result = <my big linq query>
    .Where(x => x.ClinicalAssetID == id)
    .AsEnumerable()
    .DefaultIfEmpty(defaultElement)
    .FirstOrDefault();
//只创建一次默认元素!
静态只读ClinicalAspationVcm defaultElement=新的ClinicalAspationVcm();
var结果=
.Where(x=>x.setid==id)
.可计算的()
.DefaultIfEmpty(defaultElement)
.FirstOrDefault();
这不会导致性能损失

数据库管理系统在选择数据方面进行了极大的优化。数据库查询中较慢的部分之一是将所选数据传输到本地进程。因此,让DBMS进行大部分选择是明智的,并且只有在您知道您只有真正计划使用的数据之后,才能将数据移动到本地进程

在您的情况下,您最多需要DBMS中的一个元素,如果没有,您希望使用默认对象

AsQueryable
将以智能方式将所选数据移动到本地进程,可能是每一页所选数据

页面大小是一个很好的折衷方案:不要太小,这样你就不必经常要求下一页;不要太大,这样你就不会转移比实际使用更多的物品

此外,由于
Where
语句,您最多需要一个元素。因此,获取完整的“页面”是没有问题的,页面将只包含一个元素

获取页面后,
DefaultIfEmpty
检查页面是否为空,如果为空,则返回包含
defaultElement
的序列。如果不是,则返回完整的页面


默认IFempty之后,您只接受第一个元素,这是您想要的。

原始错误意味着
NCVM
类的以下一些属性-
MeterReadingOne
MeterReadingDue
MeterReading
MeterRunitsUsed
,或
FilterReplaced
的类型为
int

记住这里的
subASSRED

let subASSRED = AR.OrderByDescending(subASSRED => subASSRED.MeterReadingDone).FirstOrDefault()
可能是
null
(没有相应的记录)

现在看投影的这一部分:

MeterReadingDone = subASSRED.MeterReadingDone,
MeterReadingDue = subASSRED.MeterReadingDue,
MeterReading = subASSRED.MeterReading,
MeterUnitsUsed = subASSRED.MeterUnitsUsed,
FilterReplaced = subASSRED.FilterReplaced
如果这是LINQ到对象,所有这些都将在运行时生成NRE(空引用异常)。在LINQtoEntities中,这被转换并作为SQL执行。SQL对诸如
subASSRED.SomeProperty
之类的表达式没有问题,因为SQL自然支持
NULL
,即使
SomeProperty
通常不允许
NULL
。因此SQL查询正常执行,但现在EF必须将结果具体化为对象,并且C#object属性不可为null,因此存在问题

要解决此问题,请找到
int
属性,并在查询中使用以下模式:

SomeIntProperty = (int?)subASSRED.SomeIntProperty ?? 0 // or other meaningful default
或者将接收对象属性类型更改为
int?
,并保持原始查询不变


对任何不可为空的类型属性执行相同的操作,例如
DateTime
double
decimal
Guid
等。

原始错误意味着
ClinicalAspaticVM
类-
MeterReadingOne
MeterReadingDue
MeterReading
的以下一些属性,
meterRunitsUsed
FilterReplace
属于
int
类型

记住这里的
subASSRED

let subASSRED = AR.OrderByDescending(subASSRED => subASSRED.MeterReadingDone).FirstOrDefault()
可能是
null
(没有相应的记录)

现在看投影的这一部分:

MeterReadingDone = subASSRED.MeterReadingDone,
MeterReadingDue = subASSRED.MeterReadingDue,
MeterReading = subASSRED.MeterReading,
MeterUnitsUsed = subASSRED.MeterUnitsUsed,
FilterReplaced = subASSRED.FilterReplaced
如果这是LINQ到对象,所有这些都将在运行时生成NRE(空引用异常)。在LINQ to Entities中,这将被转换并执行