Sqlserver SqlFunc.Subqueryable子查询 nvarchar 标识失效 返回

SqlSugar 沟通中
36 282

using System;

using System.Collections.Generic;

using System.Data;

using System.Linq;

using System.Reflection;

using SqlSugar;

namespace OrmTest

{

    class Program

    {

        static void Main(string[] args)

        {

            var db = new SqlSugarScope(new SqlSugar.ConnectionConfig()

            {

                ConnectionString = "server=.;uid=sa;pwd=sasa;database=SQLSUGAR4XTEST",

                DbType = DbType.SqlServer,

                IsAutoCloseConnection = true

            });


            //建表 

            db.CodeFirst.InitTables<Test>();

            //清空表

            db.DbMaintenance.TruncateTable<Test>();

            var insertdata = new List<Test>() { new Test() { Name = "漫画", Type = "书本" }, new Test() { Name = "间谍过家家", Type = "漫画" }, 

                new Test() { Name = "古籍", Type = "书本" }, new Test() { Name = "红楼梦", Type = "古籍" } };

            //插入测试数据

            var result = db.Insertable(insertdata).ExecuteCommand();//用例代码

            var data = db.Queryable<Test>().Where(i =>i.Type= "漫画"&&SqlFunc.Subqueryable<Test>().Where(s => s.Type == i.Name).NotAny()).Select(i => new()

            {

                Name = i.Name,

                Type = i.Type,

                TypeData = SqlFunc.Subqueryable<Test>().Where(b => b.Type == i.Name).ToList()

            }).Tolist();

            Console.WriteLine(result);

            Console.WriteLine($"漫画书本有:{data.TypeData.Count()}本");

            Console.WriteLine("用例跑完");

            Console.ReadKey();

        }

        //建类

        public class Test

        {


            [SugarColumn(ColumnDataType = "nvarchar(50)", ColumnName = "name")]

            public string? Name { get; set; }


            [SugarColumn(ColumnDataType = "nvarchar(50)", ColumnName = "Type")]

            public string? Type { get; set; }


        }



    }

}


热忱回答36

  • ColumnDataType = "nvarchar(50)" 是用来建表的 ,和查询没任何关系

    0 回复
  • 你的问题是报错还是什么

    0 回复
  • @fate sta:查询不出来数据TypeData 子查询应该可以获取出1条数据,我看加了ColumnDataType = "nvarchar(50)"的SqlServer查询语句生成的N' 去处理nvarchar类型的

    0 回复
  • 如果去ColumnDataType = "nvarchar(50)"   ToSqlString()的sqlserver 语句就不会含有N'去识别为Unicode 字符,这样的话data也会一条数据都查不到

    0 回复
  • @fate sta:您可以试一下去ColumnDataType = "nvarchar(50)"  数据库改为Mysql,这个时候会输出   漫画书本有:1本   而sqlserver则只会输出  漫画书本有:0本

    0 回复
  • @本号已停用

    你的代码少了一个=,应该写成=="漫画"

    image.png

    0 回复
  • @fate sta:不好意思改案例的时候没注意了,这个Sqlserver的Nvarchar子查询问题有机会解决吗?

    0 回复
  • @本号已停用:你改了测试了吗?

    0 回复
  • 你的代码有问题

    0 回复
  • @fate sta:改了测试是一样的mysql输出1本。sqlserver 为0本,是我sqlserver问题?

    0 回复
  • image.png

    0 回复
  • 我用sqlserver显示是一本书

    0 回复
  • select先删掉 ,然后用sqlprofile监控一下SQL ,拿出监控出来的SQL去数据库测试


    0 回复
  • image.png

    返回1条正常

    0 回复
  • String是nvarchar ,anistring是varchar 传的也没有错

     db.Aop.OnLogExecuting = (x, y) =>
     {
         Console.WriteLine(UtilMethods.GetNativeSql(x,y));
     };


    0 回复
  • SqlServer 

    using System;


    using System.Collections.Generic;


    using System.Data;


    using System.Linq;


    using System.Reflection;

    using SqlSugar;


    namespace OrmTest


    {

        class Program


        {

            static void Main(string[] args)


            {


                var db = new SqlSugarScope(new SqlSugar.ConnectionConfig()


                {


                    ConnectionString = "server=appdnan57;uid=MockUser;pwd=Mock@User_666;database=MesMock;Encrypt=True;TrustServerCertificate=True;",


                    DbType = SqlSugar.DbType.SqlServer,


                    IsAutoCloseConnection = true


                });

                //建表 


                db.CodeFirst.InitTables<Test>();


                //清空表


                db.DbMaintenance.TruncateTable<Test>();


                var insertdata = new List<Test>() { new Test() { Name = "漫画", Type = "书本" }, new Test() { Name = "间谍过家家", Type = "漫画" },


                    new Test() { Name = "红楼梦", Type = "古籍" } };


                //插入测试数据


                var result = db.Insertable(insertdata).ExecuteCommand();//用例代码


                var data = db.Queryable<Test>().Where(i => i.Type == "书本" && SqlFunc.Subqueryable<Test>().Where(s => s.Name == i.Type).NotAny()).Select(i => new

                {

                    Name = i.Name,

                    Type = i.Type,

                    TypeData = SqlFunc.Subqueryable<Test>().Where(b => b.Type == i.Name).ToList()

                }).ToList();


                Console.WriteLine(result);


                Console.WriteLine($"漫画书本有:{data.First().TypeData.Count()}本");


                Console.WriteLine("用例跑完");


                Console.ReadKey();


            }


            //建类


            public class Test


            {




                [SugarColumn(ColumnDataType = "nvarchar(50)", ColumnName = "name")]


                public string? Name { get; set; }




                [SugarColumn(ColumnDataType = "nvarchar(50)", ColumnName = "Type")]


                public string? Type { get; set; }




            }






        }


    }


    0 回复
  • 又发一遍是什么意思

    和刚才有什么不一样吗?

    0 回复
  • Mysql

    using System;


    using System.Collections.Generic;


    using System.Data;


    using System.Linq;


    using System.Reflection;

    using SqlSugar;


    namespace OrmTest


    {

        class Program


        {

            static void Main(string[] args)


            {


                var db = new SqlSugarScope(new SqlSugar.ConnectionConfig()


                {


                    ConnectionString = "",


                    DbType = SqlSugar.DbType.MySql,


                    IsAutoCloseConnection = true


                });

                //建表 


                db.CodeFirst.InitTables<Test>();


                //清空表


                //db.DbMaintenance.TruncateTable<Test>();


                //var insertdata = new List<Test>() { new Test() { Name = "漫画", Type = "书本" }, new Test() { Name = "间谍过家家", Type = "漫画" },


                //    new Test() { Name = "红楼梦", Type = "古籍" } };


                //插入测试数据


                //var result = db.Insertable(insertdata).ExecuteCommand();//用例代码


                var data = db.Queryable<Test>().Where(i => i.Type == "书本" && SqlFunc.Subqueryable<Test>().Where(s => s.Name == i.Type).NotAny()).Select(i => new

                {

                    Name = i.Name,

                    Type = i.Type,

                    TypeData = SqlFunc.Subqueryable<Test>().Where(b => b.Type == i.Name).ToList()

                }).ToList();


                //Console.WriteLine(result);


                Console.WriteLine($"漫画书本有:{data.First().TypeData.Count()}本");


                Console.WriteLine("用例跑完");


                Console.ReadKey();


            }


            //建类


            public class Test


            {




                [SugarColumn(ColumnDataType = "nvarchar(50)", ColumnName = "name")]


                public string? Name { get; set; }




                [SugarColumn(ColumnDataType = "nvarchar(50)", ColumnName = "Type")]


                public string? Type { get; set; }




            }






        }


    }


    0 回复
  • 和刚有什么不一样。sqlserver我跑了有记录

    0 回复
  • 还有select先删掉你的用例暂时用不到select

    0 回复
  • IMG_2029.png

    0 回复
  • IMG_2030.png

    0 回复
  • 我的需求就是在select中调用子查询加父级字段数据获取数据,所以要这个select

    0 回复
  • @本号已停用: 你是select中的数据是0还是 外面的的list数据是0描述清楚问题

    0 回复
  • using SqlSugar;
    using System;
    
    namespace OrmTest
    {
    
    
        using System;
    
        using System.Collections.Generic;
    
        using System.Data;
    
        using System.Linq;
    
        using System.Reflection;
    
        using SqlSugar;
    
        namespace OrmTest
    
        {
    
            class Program
    
            {
    
                static void Main(string[] args)
    
                {
    
                    var db = DbHelper.GetNewDb();
    
    
                    db.Aop.OnLogExecuting = (x, y) =>
                    {
                        Console.WriteLine(UtilMethods.GetNativeSql(x,y));
                    };
    
                    //建表 
    
                    db.CodeFirst.InitTables<Test>();
    
                    //清空表
    
                    db.DbMaintenance.TruncateTable<Test>();
    
                    var insertdata = new List<Test>() { new Test() { Name = "漫画", Type = "书本" }, new Test() { Name = "间谍过家家", Type = "漫画" },
    
    
    
                    new Test() { Name = "红楼梦", Type = "古籍" } };
                    //插入测试数据
    
                    var result = db.Insertable(insertdata).ExecuteCommand();//用例代码
    
                    var data = db.Queryable<Test>().Where(i => i.Type == "书本" && SqlFunc.Subqueryable<Test>().Where(s => s.Name == i.Type).NotAny()).Select(i => new
    
                    {
    
                        Name = i.Name,
    
                        Type = i.Type,
    
                        TypeData = SqlFunc.Subqueryable<Test>().Where(b => b.Type == i.Name).ToList()
    
                    }).ToList();
    
    
    
                    Console.WriteLine(result);
     
    
                    Console.WriteLine("用例跑完");
    
                    Console.ReadKey();
    
                }
    
                [SugarTable("UnitTestdafa")]
    
                public class Test
    
                {
    
    
    
                    [SugarColumn(ColumnDataType = "nvarchar(50)", ColumnName = "name")]
    
                    public string? Name { get; set; }
    
    
    
                    [SugarColumn(ColumnDataType = "nvarchar(50)", ColumnName = "Type")]
    
                    public string? Type { get; set; }
    
    
    
                }
    
    
    
    
    
            }
    
        }
    
        /// <summary>
        /// Helper class for database operations
        /// 数据库操作的辅助类
        /// </summary>
        public class DbHelper
        {
            /// <summary>
            /// Database connection string
            /// 数据库连接字符串
            /// </summary>
            public readonly static string Connection = "server=.;uid=sa;pwd=sasa;database=SqlSugar5Demo;Encrypt=True;TrustServerCertificate=True";
    
            /// <summary>
            /// Get a new SqlSugarClient instance with specific configurations
            /// 获取具有特定配置的新 SqlSugarClient 实例
            /// </summary>
            /// <returns>SqlSugarClient instance</returns>
            public static SqlSugarClient GetNewDb()
            {
                var db = new SqlSugarClient(new ConnectionConfig()
                {
                    IsAutoCloseConnection = true,
                    DbType = SqlSugar.DbType.SqlServer,
                    ConnectionString = Connection,
                    LanguageType=LanguageType.Default//Set language
    
                },
                it => {
                    // Logging SQL statements and parameters before execution
                    // 在执行前记录 SQL 语句和参数
                    it.Aop.OnLogExecuting = (sql, para) =>
                    {
                        Console.WriteLine(UtilMethods.GetNativeSql(sql, para));
                    };
                });
                return db;
            }
        }
    }

    我测试下来有记录

    0 回复
  • image.png

    0 回复
  • IMG_2031.png

    0 回复
  • 我用您的代码还是显示为0 ,是需要改SqlServer种的什么配置吗?
    运行生成的Sql是这样的:

    [Sql]:IF EXISTS (SELECT * FROM sys.objects with(nolock)

                            WHERE type='u' AND name=N'UnitTestdafa')

                            SELECT 1 AS res ELSE SELECT 0 AS res;



    [Sql]:CREATE TABLE [UnitTestdafa](

    [name] nvarchar(50) NOT NULL  ,

    [Type] nvarchar(50) NOT NULL  )



    [Sql]:SELECT sysobjects.name AS TableName,

                               syscolumns.Id AS TableId,

                               syscolumns.name AS DbColumnName,

                               systypes.name AS DataType,

                               COLUMNPROPERTY(syscolumns.id,syscolumns.name,'PRECISION') as [length],

                               isnull(COLUMNPROPERTY(syscolumns.id,syscolumns.name,'Scale'),0) as Scale,

                                                       isnull(COLUMNPROPERTY(syscolumns.id,syscolumns.name,'Scale'),0) as DecimalDigits,

                               Cast( sys.extended_properties.[value] as nvarchar(2000)) AS [ColumnDescription],

                               syscomments.text AS DefaultValue,

                               syscolumns.isnullable AS IsNullable,

                                   columnproperty(syscolumns.id,syscolumns.name,'IsIdentity')as IsIdentity,

                               (CASE

                                    WHEN EXISTS

                                           (

                                                    select 1

                                                                                                    from sysindexes i

                                                                                                    join sysindexkeys k on i.id = k.id and i.indid = k.indid

                                                                                                    join sysobjects o on i.id = o.id

                                                                                                    join syscolumns c on i.id=c.id and k.colid = c.colid

                                                                                                    where o.xtype = 'U'

                                                                                                    and exists(select 1 from sysobjects where xtype = 'PK' and name = i.name)

                                                                                                    and o.name=sysobjects.name and c.name=syscolumns.name

                                           ) THEN 1

                                    ELSE 0

                                END) AS IsPrimaryKey

                        FROM syscolumns

                        INNER JOIN systypes ON syscolumns.xtype = systypes.xtype

                        LEFT JOIN sysobjects ON syscolumns.id = sysobjects.id

                        LEFT OUTER JOIN sys.extended_properties ON (sys.extended_properties.minor_id = syscolumns.colid

                                                                    AND sys.extended_properties.major_id = syscolumns.id)

                        LEFT OUTER JOIN syscomments ON syscolumns.cdefault = syscomments.id

                        WHERE syscolumns.id IN

                            (SELECT id

                             FROM sysobjects

                             WHERE upper(xtype) IN('U',

                                            'V') )

                          AND (systypes.name <> 'sysname')

                          AND sysobjects.name=N'UnitTestdafa'

                          AND systypes.name<>'geometry'

                          AND systypes.name<>'geography'

                        ORDER BY syscolumns.colid



    [Sql]:INSERT [UnitTestdafa]  ([name],[Type])

     SELECT N'漫画' AS [name],N'书本' AS [Type]

    UNION ALL

     SELECT N'间谍过家家' AS [name],N'漫画' AS [Type]

    UNION ALL

     SELECT N'红楼梦' AS [name],N'古籍' AS [Type]

    ;

    select SCOPE_IDENTITY();



    [Sql]:SELECT  [name] AS [Name] , [Type] AS [Type] ,[i].[name] as app_ext_col_0 FROM [UnitTestdafa] [i]  WHERE (( [Type] = @Type0 ) AND (NOT EXISTS ( SELECT * FROM [UnitTestdafa] [s]  WHERE ( [name] = [i].[Type] ) )))

    [Pars]:

    [Name]:@Type0 [Value]:书本 [Type]:String



    [Sql]:(SELECT *,0 as sugarIndex FROM [UnitTestdafa] [b]  WHERE ( [Type] = '漫画' ))

    [Pars]:

    [Name]:@Type0 [Value]:书本 [Type]:String


    0 回复
  • 看起来是这里的问题

    [Sql]:(SELECT *,0 as sugarIndex FROM [UnitTestdafa] [b]  WHERE ( [Type] = '漫画' ))我这里的N'不见了

    0 回复
  • SELECT *,0 as sugarIndex FROM [UnitTestdafa] [b]  WHERE ( [Type] = '漫画' )  这个能不能查出数据。如果能出来就和N没有关系

    0 回复
  • 在sqlserver能不能查出来

    0 回复
  • @fate sta:应该就是这个n的问题IMG_2032.png

    0 回复
  • 我们客户的数据库是这样的我们只能操作表改不了数据库IMG_2033.png

    0 回复
  • 我处理一下

    0 回复
  • @fate sta:感谢大佬

    0 回复
  • SqlSugarCore 5.1.4.183-preview01


    过五分钟后安装到预览版本 已修复

    默认带N

    如果不想要N可以通过文档:字符索引优化去掉

    0 回复