多列In查询时,若条件为HashSet会报空引用 返回

SqlSugar 沟通中
1 266

如Demo。HashSet作为一个正常的IEnumerable,从直觉上讲理应能够作为此处的条件集合,但却报了空引用。把HashSet转为List再作为条件集合就OK


using Microsoft.Extensions.Configuration;
using SqlSugar;

namespace SqlSugarDemo;

[SugarTable]
public class MyEntity12260845
{
    [SugarColumn(IsPrimaryKey = true, Length = 30)]
    public string Id { get; set; }

    public string School { get; set; }

    public string Major { get; set; }
}

public class HashSetNullReferenceException
{
    public static void Run()
    {
        ISqlSugarClient db = GetDb();

        db.CodeFirst.InitTables<MyEntity12260845>();

        List<MyEntity12260845> entities =
        [
            new MyEntity12260845
            {
                Id = SnowFlakeSingle.Instance.NextId().ToString(),
                School = "School1",
                Major = "Major1"
            },
            new MyEntity12260845
            {
                Id = SnowFlakeSingle.Instance.NextId().ToString(),
                School = "School2",
                Major = "Major2"
            },
            new MyEntity12260845
            {
                Id = SnowFlakeSingle.Instance.NextId().ToString(),
                School = "School3",
                Major = "Major3"
            },
            new MyEntity12260845
            {
                Id = SnowFlakeSingle.Instance.NextId().ToString(),
                School = "School4",
                Major = "Major4"
            }
        ];
        db.Insertable(entities).ExecuteCommand();

        var hashSet = entities.Skip(1).Take(2).Select(e => new { e.School, e.Major }).ToHashSet();
        var list = hashSet.ToList();

        // 正常情况:
        List<MyEntity12260845> res0 = db.Queryable<MyEntity12260845>()
            .Where(e => list.Any(c => c.School == e.School && c.Major == e.School))
            .ToList();

        // 空引用:hashSet为null
        List<MyEntity12260845> res1 = db.Queryable<MyEntity12260845>()
            .Where(e => hashSet.Any(c => c.School == e.School && c.Major == e.School))
            .ToList();
    }

    private static ISqlSugarClient GetDb()
    {
        ConfigurationBuilder configBuilder = new();
        configBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
        IConfigurationRoot configRoot = configBuilder.Build();

        SqlSugarClient Db = new SqlSugarClient(new ConnectionConfig()
        {
            ConnectionString = configRoot["connStr"],
            DbType = DbType.Oracle,
            IsAutoCloseConnection = true
        },
            db =>
            {

                db.Aop.OnLogExecuting = (sql, pars) =>
                {

                    //获取原生SQL推荐 5.1.4.63  性能OK
                    Console.WriteLine(UtilMethods.GetNativeSql(sql, pars));

                    //获取无参数化SQL 对性能有影响,特别大的SQL参数多的,调试使用
                    //Console.WriteLine(UtilMethods.GetSqlString(DbType.SqlServer,sql,pars))


                };

                //注意多租户 有几个设置几个
                //db.GetConnection(i).Aop

            });
        return Db;
    }
}


热忱回答1

  • fate sta fate sta VIP0
    2024/12/26

    先用list, haset这个类型C#一般很少有人用 后续在做兼容

    0 回复