• LINQ to SQL 的常见异常及解决办法


    Ø  简介

    本文主要介绍 LINQ to SQL 中常见的异常,以及对应的解决办法。包括以下内容:

    1.   左连接情况下,右表非空类型字段可能抛出异常

     

    1.   左连接情况下,右表非空类型字段可能抛出异常

    说明:UserInfo.CustomerId 关联 Customer.Id,为多对一的关系。但是 UserInfo.CustomerId 字段可能为 null, 所以运行以下语句将报错:

    1)   LINQ 语句

    var datas1 = (from t1 in DataContext.UserInfoes

                    join t2 in DataContext.Customers on t1.CustomerId equals t2.Id into t12

                    from t3 in t12.DefaultIfEmpty()

                    where t1.id > 5000

                    select new

                    {

                        UserId = t1.id,

                        CustomerId1 = t1.CustomerId,

                        CustomerId2 = t3.Id

                    }).Take(3).ToArray();

    2)   生成 SQL

    SELECT

        [Limit1].[C1] AS [C1],

        [Limit1].[id] AS [id],

        [Limit1].[CustomerId] AS [CustomerId],

        [Limit1].[id1] AS [id1]

        FROM ( SELECT TOP (3)

            [Extent1].[id] AS [id],

            [Extent1].[CustomerId] AS [CustomerId],

            1 AS [C1],

            [Extent2].[Id] AS [id1]

            FROM  [dbo].[UserInfo] AS [Extent1]

            LEFT OUTER JOIN [dbo].[Customer] AS [Extent2] ON [Extent1].[CustomerId] = [Extent2].[Id]

            WHERE [Extent1].[id] > 5000

        )  AS [Limit1]

    3)   执行结果

    clip_image001[4]

    4)   将抛出异常

    System.InvalidOperationException:到值类型“System.Int64”的强制转换失败,因为具体化值为 null。结果类型的泛型参数或查询必须使用可以为 null 的类型。

    5)   解决办法:

    1.   分析:其实很简单,因为是左连接,左表记录不能与右表连接时,右表字段将以 null 返回。但是程序中是以 long 类型接收,不能为 null 值,所以就报错了。

    2.   那我们是不是将非空类型(long)改为可空类型(Nullable<long>)就可以了?没错,我们只需要改写一行代码即可:

    CustomerId2 = (long?)t3.Id

  • 相关阅读:
    MooseFS基础和安装
    自动化运维工具SaltStack详细部署
    linux中的通配符与正则表达式
    使用GitHub做个人博客
    mysql数据库分库备份脚本
    php-fpm配置详解
    php-fpm安装、配置与优化
    ceph的正常卸载与非正常卸载
    CentOS系统/tmp目录里面的文件默认保留多久
    ansible常用命令
  • 原文地址:https://www.cnblogs.com/abeam/p/9377164.html
Copyright © 2020-2023  润新知