Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/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
C# 转换为值类型“Int32”失败,因为具体化的值为null_C#_.net_Entity Framework_Linq To Entities - Fatal编程技术网

C# 转换为值类型“Int32”失败,因为具体化的值为null

C# 转换为值类型“Int32”失败,因为具体化的值为null,c#,.net,entity-framework,linq-to-entities,C#,.net,Entity Framework,Linq To Entities,我有以下代码。我得到一个错误: 转换为值类型“Int32”失败,因为具体化的值为null。结果类型的泛型参数或查询必须使用可为空的类型 当CreditHistory表没有记录时 var creditsSum = (from u in context.User join ch in context.CreditHistory on u.ID equals ch.UserID

我有以下代码。我得到一个错误:

转换为值类型“Int32”失败,因为具体化的值为null。结果类型的泛型参数或查询必须使用可为空的类型

当CreditHistory表没有记录时

var creditsSum = (from u in context.User
                  join ch in context.CreditHistory on u.ID equals ch.UserID                                        
                  where u.ID == userID
                  select ch.Amount).Sum();
如何修改查询以接受空值?

若要允许“金额”字段为空,只需使用空合并运算符将空值转换为0即可

var creditsSum = (from u in context.User
              join ch in context.CreditHistory on u.ID equals ch.UserID                                        
              where u.ID == userID
              select ch.Amount ?? 0).Sum();

linq到sql查询不是作为代码执行,而是转换为sql。有时,这是一个漏洞百出的抽象,会产生意想不到的行为

其中一种情况是空处理,在不同的地方可能会出现意外的空。。。DefaultIfEmpty0.Sum0在这种非常简单的情况下会有所帮助,在这种情况下,可能没有元素,sql的SUM返回null,而c期望0

更一般的方法是使用??当生成的SQL有返回意外null的风险时,将转换为合并:

var creditsSum = (from u in context.User
              join ch in context.CreditHistory on u.ID equals ch.UserID                                        
              where u.ID == userID
              select (int?)ch.Amount).Sum() ?? 0;
这第一个强制转换为int?告诉C编译器这个表达式确实可以返回null,即使Sum返回int。那么我们使用normal??运算符来处理空情况

基于这个答案,我编写了一个包含LINQ to SQL和LINQ to Entities详细信息的报告。

如果您使用的是聚合函数,而该函数没有获取要执行操作的项,则必须验证LINQ查询是否给出了一些结果,如下所示:

var maxOrderLevel =sdv.Any()? sdv.Max(s => s.nOrderLevel):0

我已经使用了这段代码,它正确响应,只有输出值可以为null

var packesCount = await botContext.Sales.Where(s => s.CustomerId == cust.CustomerId && s.Validated)
                                .SumAsync(s => (int?)s.PackesCount);
                            if(packesCount != null)
                            {
                                // your code
                            }
                            else
                            {
                                // your code
                            }

我看到这个问题已经得到了回答。但是如果你想把它分成两个语句,可以考虑以下内容

var credits = from u in context.User
              join ch in context.CreditHistory 
                  on u.ID equals ch.UserID                                        
              where u.ID == userID
              select ch;

var creditSum= credits.Sum(x => (int?)x.Amount) ?? 0;

当我试图从视图中选择时出现此错误消息

问题是视图最近在SubscriberId列中获得了一些新的空行,并且它没有首先在EDMX EF数据库中更新

该列必须是可为null的类型才能工作

var dealer=Context.Dealers.Wherex=>x.dealerCode==dealerCode.FirstOrDefault

在视图刷新之前:

public int SubscriberId { get; set; }
public Nullable<int> SubscriberId { get; set; }
视图刷新后:

public int SubscriberId { get; set; }
public Nullable<int> SubscriberId { get; set; }
在EDMX中删除视图并将其添加回工作状态


希望它能帮助别人

在运行时使用以下代码在Entity Framework 6中出现此错误:

var fileEventsSum = db.ImportInformations.Sum(x => x.FileEvents)
从LeandroSoares更新:

将此选项用于单次执行:

var fileEventsSum = db.ImportInformations.Sum(x => (int?)x.FileEvents) ?? 0
原件:

改成这个,然后它工作了:

var fileEventsSum = db.ImportInformations.Any() ? db.ImportInformations.Sum(x => x.FileEvents) : 0;

我也面临着同样的问题,并通过将列设为可为null来解决?接线员

Sequnce = db.mstquestionbanks.Where(x => x.IsDeleted == false && x.OrignalFormID == OriginalFormIDint).Select(x=><b>(int?)x.Sequence</b>).Max().ToString();


有时返回null。

当我使用提示时,编译器说:运算符“??”不能应用于“int”和“int”类型的操作数。我忘了什么吗?@zosim:这就是为什么要在int中添加施法的原因?首先,我添加了int?,但有相同的例外。当你拥有dev env时,我会感谢你。检查这个语法有什么错误。@zosim:我不明白这个问题。如果Amount是int,那么我们已经确定它不能为null,并且合并是不必要的。如果您得到的是您所说的错误,那么Amount不可为null,它只是一个int,在这种情况下,您可能需要在设计器中更改linq2sql dbml列以允许为null。@递归:Amount为int,这是可以的。金额已经有了价值。我认为,出现上述错误是因为CreditHistory表为空。我在用户表中有一条记录,在CreditHistory表中有0条记录,出现错误。当我使用DefaultIfEmpty0.Sum时,它可以正常工作,但是使用??0它抛出错误。我的另一个问题是,在这种情况下,什么是最佳做法?DefaultIfEmpty0?谢谢Hanks Anders,使用DefaultIfEmpty0.Sum的解决方案对我来说很好。我还用int?尝试了第二种解决方案??0…,但它会引发与以前相同的异常。最后,我们开始测试并调整它,所以现在第二个版本也可以工作。当应用于空数据集时,Sum和其他聚合函数将返回null。与它们的定义相反,实际上它们返回基础类型的可空版本。@递归:您的示例是LINQ到对象,而不是LINQ到SQL或LINQ到实体。他们的底层数据提供者使他们的行为有所不同。这是一个好主意。我更新了我的返回对象,使其具有可为null的属性,这将使sdv执行两次。这不是你想要的iQueryables能执行两次吗?这不是一个好答案。它将从数据库中检索两次。@nawfal这是真的,但比运行时错误要好得多。您完全可以使用LINQtoSQL,但使用lambda则更难。您当然可以捕捉到异常,但我认为解决方案比两次执行更糟糕。@LeandroSoares如上所述comment@LeandroSoares不错!我更新了我的答案,并使用了您提供的代码和说明为什么要使用它。这也是我的问题和我的答案