dotnetcore / FreeSql

🦄 .NET aot orm, C# orm, VB.NET orm, Mysql orm, Postgresql orm, SqlServer orm, Oracle orm, Sqlite orm, Firebird orm, 达梦 orm, 人大金仓 orm, 神通 orm, 翰高 orm, 南大通用 orm, 虚谷 orm, 国产 orm, Clickhouse orm, QuestDB orm, MsAccess orm.
http://freesql.net
MIT License
3.99k stars 842 forks source link

实体的属性的 Column 定义了 sql 返回中不存在的字段 报错 #1775

Closed zhujiancc closed 1 month ago

zhujiancc commented 1 month ago

public class User
{
    [Column(Name = "user_id")] public string UserId { get; set; }
    [Column(Name = "platform_id")] public string PlatformId { get; set; }
    [Column(Name = "user_name")] public string UserName { get; set; }
    [Column(Name = "head_url")] public string HeadUrl { get; set; }
    [Column(Name = "is_original")] public int IsOriginal{ get; set; }
}

var searchCmd="select user_id,platform_id,user_name,head_url  from user"

freesql.Select<User>().WithSql(searchCmd, request).ToList()

sql 没有返回is_original , 但实体定义了 [Column(Name = "is_original")] public int IsOriginal{ get; set; }
报错如下:

image

数据库版本

Postgresql

安装的Nuget包

FreeSql.Provider.Postgresql 3.2.813

.net framework/. net core? 及具体版本

net core

d4ilys commented 1 month ago

var searchCmd="select user_id,platform_id,user_name,head_url from User"

zhujiancc commented 1 month ago

var searchCmd="select user_id,platform_id,user_name,head_url from User"

我的案例可能简化了, 没有描述清楚 , 场景是 , sql是多表联查的, 返回值结果是动态的,
这边定义了一个完整的model 来接收 (model并不是真实的数据库类模型), 就会出现上面的错误

d4ilys commented 1 month ago

在PostgreSql中,默认有一张user表用来存放PostgreSql的用户,当我们自己建立一个user表的时候,优先访问系统默认的user表

//防止和系统冲突
[Table(Name = "t_user")]
public class User
{
    [Column(Name = "user_id")] public string UserId { get; set; }
    [Column(Name = "platform_id")] public string PlatformId { get; set; }
    [Column(Name = "user_name")] public string UserName { get; set; }
    [Column(Name = "head_url")] public string HeadUrl { get; set; }
    [Column(Name = "is_original")] public int IsOriginal{ get; set; }
}
d4ilys commented 1 month ago

提供一个Demo我们复现一下看看

zhujiancc commented 1 month ago

以下 是demo :【PostgreSQLCodeFirstTest】

[Fact]
public void ColumnNotExistTest()
{
    g.pgsql.Insert(new Blogger()
    {
        Name = "hello",
        FansCount = 1,
        HeadUrl = "xxx.jpg"
    }).ExecuteAffrows();

    var cmd = "select id,name,fans_count from Blogger";

    var result= g.pgsql.Select<Blogger>().WithSql(cmd).ToList();
}

public class Blogger
{
    [Column(Name = "id",IsIdentity = true)] public int Id { get; set; }
    [Column(Name = "name")]public string Name { get; set; }
    [Column(Name = "fans_count")] public int FansCount { get; set; }
    [Column(Name = "head_url")] public string  HeadUrl { get; set; }
}

源码调试了下 ,生成的sql 有点问题 ,
a."id", a."name", a."fans_count", a."head_url" 生成是从实体中来的, 子查询并没有返回head_url

SELECT a."id", a."name", a."fans_count", a."head_url" 
FROM ( select id,name,fans_count from Blogger ) a

这里要不直接

SELECT a.*
FROM ( select id,name,fans_count from Blogger ) a
2881099 commented 1 month ago

var result= g.pgsql.Select\<Blogger>().WithSql(cmd).ToList("*")

针对特别的查询,特别处理一下

2881099 commented 1 month ago

一般除了需要二次加工,比如嵌套SQL进行分页,才会用到withsql

否则不如直接使用ado.Query