Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.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# Visual Studio中未引发预期异常,Linq Select语句意外筛选结果_C#_Visual Studio_Linq To Entities_Linqpad - Fatal编程技术网

C# Visual Studio中未引发预期异常,Linq Select语句意外筛选结果

C# Visual Studio中未引发预期异常,Linq Select语句意外筛选结果,c#,visual-studio,linq-to-entities,linqpad,C#,Visual Studio,Linq To Entities,Linqpad,我遇到了一个非常奇怪的情况,其中一段代码使用C#和Linq转换为实体,我本以为会抛出一个异常,但在Visual Studio中没有,但在Linqpad中抛出了,我想知道是否有人能够解释为什么会这样。下面是测试的代码片段和情况 这是一段有问题的代码,它提取了修改模板的用户的信息: Db.CommunicationTemplates.Select(i => new CommunicationTemplateModel { ModificationUserId = (int)i.Mod

我遇到了一个非常奇怪的情况,其中一段代码使用C#和Linq转换为实体,我本以为会抛出一个异常,但在Visual Studio中没有,但在Linqpad中抛出了,我想知道是否有人能够解释为什么会这样。下面是测试的代码片段和情况

这是一段有问题的代码,它提取了修改模板的用户的信息:

Db.CommunicationTemplates.Select(i => new CommunicationTemplateModel
{
     ModificationUserId = (int)i.ModificationUserId,
     ModificationFirstName = i.ModificationUser.FirstName,
     ModificationLastName = i.ModificationUser.LastName
})
我的一位同事将此更改提交测试。我的开发人员错误地将数据库列设置为可空,但不应:

public int? ModificationUserId { get; set; }
这种情况下的测试数据非常简单,我们有3条记录。2有一个null ModificationUserId,一个有一个值,例如

空的 123456 空的

这是具有名字和姓氏的users表的外键

我原以为这段代码会抛出一个强制转换异常,但它只是过滤掉了有问题的代码,并且只成功返回了包含“123456”的一行。为了测试代码,我将查询弹出到Linqpad中并运行它,这样做时,我确实得到了预期的错误:

The null value cannot be assigned to a member with type System.Int32 which is a non-nullable value type
这让我想到了,为什么要把它放在Linqpad中,而不是Visual Studio中

在我们的Visual Studio代码中,我将行简化为:

Db.CommunicationTemplates.Select(i => (int)i.ModificationUserId)
令我惊讶的是,它确实在Linqpad和Visual Studio中抛出了类型转换错误。随后,我返回并尝试了以下代码:

CommunicationTemplates.Select(i => new 
{
    ModificationFirstName = i.ModificationUser.FirstName,
    ModificationLastName = i.ModificationUser.LastName
})
再一次让我惊讶的是,它返回了不一致的结果。在VisualStudio中,它仅成功返回了“123456”记录,而在LinqPad中,它返回了所有3条记录。我总是希望Select语句在过滤结果之前抛出错误,因为Select语句实际上不应该过滤内容

因此,我的问题是:

  • 为什么Visual Studio在仅返回ModificationUserId时抛出类型错误,而在添加更多属性时抑制该错误?可能是因为名称属性已经过滤掉了吗
  • 为什么访问链接表上的名称属性会在Visual Studio中返回1,而在Linqpad中返回3
  • 在最初的组合示例中,Linqpad是否抛出类型错误,而VisualStudio筛选是否表明应用程序之间的执行顺序不同

我完全意识到这段代码是可以改进的,并且已经这样做了,我只是想解释一下为什么上面的示例的执行方式与预期不同。

要在LINQPad和Visual Studio中获得相同的行为,必须使用相同的API

当您在LINQPad中单击“添加连接”时,您可以选择API:LINQ to SQL或实体框架(LINQPad 6中的EF Core)。如果选择LINQ to SQL,如果希望获得相同的行为,则还必须在Visual Studio中使用LINQ to SQL。如果选择EF或EF Core,请确保选择的版本与Visual Studio中使用的版本匹配