Skip to content

FreeSql v2.0.0 版本征集意见,年底发布 #469

Closed
@2881099

Description

@2881099
Collaborator

感谢大家近两年的陪伴,和持续给出的优化建议,让 FreeSql 从无到有越来越强大。

FreeSql v2.0.0 版本现征集意见,年底发布。

欢迎跟帖发表你的需求意见。

Activity

ghost

ghost commented on Sep 22, 2020

@ghost

我技术有限只能说一句牛逼!~~

tianxin8206

tianxin8206 commented on Sep 23, 2020

@tianxin8206

支持tidb

wangjunniit

wangjunniit commented on Sep 23, 2020

@wangjunniit

叶老板牛逼!!!!!!!!!!!!!

希望实现DbContext级别的过滤器。

比如有个需求,根据http请求header里的某个值增加过滤条件,伪代码如下:

public void ConfigureServices(IServiceCollection services) 
{
  services.AddSingleton<IFreeSql>(Fsql);
  services.AddFreeDbContext<SongContext>(options => options.UseFreeSql(Fsql));
}

public ValuesController(SongContext songContext) 
{
}
public interface ITenant 
{
    string TenantId { get; set; }
}

public class Song : ITenant
{
     public string TenantId { get; set; }
}

public class SongContext : DbContext 
{

    private string _tenantId;

    public DbSet<Song> Songs { get; set; }

    public SongContext (IHttpContextAccessor httpContextAccessor)
    {
         _tenantId = httpContextAccessor.HttpContext.Request.Headers["TenantId"];
    }

    protected override void OnModelCreating(ICodeFirst codefirst)
    {
        codefirst.AddQueryFilter<ITenant>( t => t.TenantId == _tenantId );
    }
}
wangjunniit

wangjunniit commented on Sep 23, 2020

@wangjunniit

有没有可能与https://github.com/dotnetcore/CAP集成(DbContext模式)

CAP的常见用法下面两种,关键点是与一个Transaction进行关联

public class PublishController : Controller
{
    private readonly ICapPublisher _capBus;

    public PublishController(ICapPublisher capPublisher)
    {
        _capBus = capPublisher;
    }

    [Route("~/adonet/transaction")]
    public IActionResult AdonetWithTransaction()
    {
        using (var connection = new MySqlConnection(ConnectionString))
        {
            using (var transaction = connection.BeginTransaction(_capBus, autoCommit: true))
            {
                //your business logic code

                _capBus.Publish("xxx.services.show.time", DateTime.Now);
            }
        }

        return Ok();
    }

    [Route("~/ef/transaction")]
    public IActionResult EntityFrameworkWithTransaction([FromServices]AppDbContext dbContext)
    {
        using (var trans = dbContext.Database.BeginTransaction(_capBus, autoCommit: true))
        {
            //your business logic code

            _capBus.Publish("xxx.services.show.time", DateTime.Now);
        }

        return Ok();
    }
}

叶老板要不要考虑下

luoyunchong

luoyunchong commented on Sep 23, 2020

@luoyunchong
Collaborator

@wangjunniit https://github.com/luoyunchong/DotNetCore.CAP.Provider

2种方式。

  • 1.扩展方法中反射调用内部Flush方法。
  • 2.修改源码中对应的switch代码,需要在其中引用freesql相关代码。

luoyunchong/DotNetCore.CAP.Provider#1

pinned this issue on Sep 23, 2020
NMSAzulX

NMSAzulX commented on Sep 24, 2020

@NMSAzulX

在做封装的时遇到的问题:

如果使用 Freesql 自带的 JoinIn 泛型方法则没办法自定义外联表别名, 但使用不带泛型的 Join 方法参数就写死了字符串,不能兼容其他特殊语法的数据库了,所以那个泛型方法希望改进一下。

建议: Left/Inner/RightJoin(exp) API 增加一个参数,即自定义别名,LeftJoin(exp,string alias=default)

优点:

1、不耽误旧版本的使用
2、当 ToList(string) API 支持匿名类映射后,参数需支持灵活多变的调整,以便返回表和匿名类字段一一对应,此时 JOIN 查询方法提供了别名方法之后,开发者可以手动构造 ToList 方法的参数来调整匿名类映射,封装起来极有用。

例如:

 LeftJoin< OutTable >(exp,  "MyAliasOut").
ToList<XXX>("MyAliasOut.Name AS MyName ");
2881099

2881099 commented on Sep 24, 2020

@2881099
CollaboratorAuthor

叶老板牛逼!!!!!!!!!!!!!

希望实现DbContext级别的过滤器。

比如有个需求,根据http请求header里的某个值增加过滤条件,伪代码如下:

public void ConfigureServices(IServiceCollection services) 
{
  services.AddSingleton<IFreeSql>(Fsql);
  services.AddFreeDbContext<SongContext>(options => options.UseFreeSql(Fsql));
}

public ValuesController(SongContext songContext) 
{
}
public interface ITenant 
{
    string TenantId { get; set; }
}

public class Song : ITenant
{
     public string TenantId { get; set; }
}

public class SongContext : DbContext 
{

    private string _tenantId;

    public DbSet<Song> Songs { get; set; }

    public SongContext (IHttpContextAccessor httpContextAccessor)
    {
         _tenantId = httpContextAccessor.HttpContext.Request.Headers["TenantId"];
    }

    protected override void OnModelCreating(ICodeFirst codefirst)
    {
        codefirst.AddQueryFilter<ITenant>( t => t.TenantId == _tenantId );
    }
}

目前 FreeSql.Repository 有仓储级别的过滤器,还有全局过滤器。文档:https://github.com/dotnetcore/FreeSql/wiki/%E8%BF%87%E6%BB%A4%E5%99%A8

2881099

2881099 commented on Sep 24, 2020

@2881099
CollaboratorAuthor

在做封装的时遇到的问题:

如果使用 Freesql 自带的 JoinIn 泛型方法则没办法自定义外联表别名, 但使用不带泛型的 Join 方法参数就写死了字符串,不能兼容其他特殊语法的数据库了,所以那个泛型方法希望改进一下。

建议: Left/Inner/RightJoin(exp) API 增加一个参数,即自定义别名,LeftJoin(exp,string alias=default)

优点:

1、不耽误旧版本的使用
2、当 ToList(string) API 支持匿名类映射后,参数需支持灵活多变的调整,以便返回表和匿名类字段一一对应,此时 JOIN 查询方法提供了别名方法之后,开发者可以手动构造 ToList 方法的参数来调整匿名类映射,封装起来极有用。

例如:

 LeftJoin< OutTable >(exp,  "MyAliasOut").
ToList<XXX>("MyAliasOut.Name AS MyName ");

大帅,是针对 LeftJoin<T2>((a,b) => a.id == b.id) 这个方法吗?这个方法别名是 lambda 参数名 b

2881099

2881099 commented on Sep 24, 2020

@2881099
CollaboratorAuthor

支持tidb

不知道引用 FreeSql.Provider.MySqlConnector.dll 能不能访问,等有空了搭建好环境了试试

NMSAzulX

NMSAzulX commented on Sep 24, 2020

@NMSAzulX

在做封装的时遇到的问题:

如果使用 Freesql 自带的 JoinIn 泛型方法则没办法自定义外联表别名, 但使用不带泛型的 Join 方法参数就写死了字符串,不能兼容其他特殊语法的数据库了,所以那个泛型方法希望改进一下。

建议: Left/Inner/RightJoin(exp) API 增加一个参数,即自定义别名,LeftJoin(exp,string alias=default)

优点:

1、不耽误旧版本的使用
2、当 ToList(string) API 支持匿名类映射后,参数需支持灵活多变的调整,以便返回表和匿名类字段一一对应,此时 JOIN 查询方法提供了别名方法之后,开发者可以手动构造 ToList 方法的参数来调整匿名类映射,封装起来极有用。

例如:

 LeftJoin< OutTable >(exp,  "MyAliasOut").
ToList<XXX>("MyAliasOut.Name AS MyName ");

大帅,是针对 LeftJoin((a,b) => a.id == b.id) 这个方法吗?这个方法别名是 lambda 参数名 b

LeftJoin/RightJoin/InnerJoin 如果多表联合查询的话 这种命名怕是不太妥,如果加上参数,你的方法里可以判断以下,如果有命名了就用参数的命名,没有命名,就用b, 这样开放出来API对于二次开发的人员更加友好。

lzw5399

lzw5399 commented on Sep 27, 2020

@lzw5399

有没有计划支持一下SAP HANA。。。最近着实被这玩意搞得有点难受

文档地址:
https://help.sap.com/viewer/b3ee5778bc2e4a089d3299b82ec762a7/2.0.02/en-US/9165807e2ded490ea06f46035c3e58b1.html

2881099

2881099 commented on Sep 27, 2020

@2881099
CollaboratorAuthor

在做封装的时遇到的问题:

如果使用 Freesql 自带的 JoinIn 泛型方法则没办法自定义外联表别名, 但使用不带泛型的 Join 方法参数就写死了字符串,不能兼容其他特殊语法的数据库了,所以那个泛型方法希望改进一下。

建议: Left/Inner/RightJoin(exp) API 增加一个参数,即自定义别名,LeftJoin(exp,string alias=default)

优点:

1、不耽误旧版本的使用
2、当 ToList(string) API 支持匿名类映射后,参数需支持灵活多变的调整,以便返回表和匿名类字段一一对应,此时 JOIN 查询方法提供了别名方法之后,开发者可以手动构造 ToList 方法的参数来调整匿名类映射,封装起来极有用。

例如:

 LeftJoin< OutTable >(exp,  "MyAliasOut").
ToList<XXX>("MyAliasOut.Name AS MyName ");

大帅,是针对 LeftJoin((a,b) => a.id == b.id) 这个方法吗?这个方法别名是 lambda 参数名 b

LeftJoin/RightJoin/InnerJoin 如果多表联合查询的话 这种命名怕是不太妥,如果加上参数,你的方法里可以判断以下,如果有命名了就用参数的命名,没有命名,就用b, 这样开放出来API对于二次开发的人员更加友好。

.LeftJoin("table2 AS MyAliasOut on a.id = MyAliasOut.xxid")

ToList("MyAliasOut.Name AS MyName")

如果这样使用是否可行,都是纯字符串操作。

2881099

2881099 commented on Sep 27, 2020

@2881099
CollaboratorAuthor

有没有计划支持一下SAP HANA。。。最近着实被这玩意搞得有点难受

文档地址:
https://help.sap.com/viewer/b3ee5778bc2e4a089d3299b82ec762a7/2.0.02/en-US/9165807e2ded490ea06f46035c3e58b1.html

今天做了调研:

1、从文档来看,技术上实现起来问题不大(都是关系型数据库),适配需要时间

2、从 nuget 上下载量来看(参数的 linq2db),实在太少

暂时作出的决定:

国内大环境正在实行”安可“国产化,我们更希望多点支持国产数据库。

从 nuget 查看下载量太少,暂时不会安排专门支持该数据库的开发。

建议:

可以参考 Odbc 通用方案进行适配访问 SAP HANA,文档:https://github.com/dotnetcore/FreeSql/blob/master/Providers/FreeSql.Provider.Odbc/readme.md

该方案需要自己重写一套适配器:https://github.com/dotnetcore/FreeSql/blob/master/Providers/FreeSql.Provider.Odbc/Default/OdbcAdapter.cs

60 remaining items

Loading
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @gudufy@alexinea@sgf@wangjunniit@jianliulin

        Issue actions

          FreeSql v2.0.0 版本征集意见,年底发布 · Issue #469 · dotnetcore/FreeSql