【问题标题】:ServiceStack OrmLite CustomSelect not working?ServiceStack OrmLite CustomSelect 不工作?
【发布时间】:2016-11-01 04:40:18
【问题描述】:

我正在尝试使用此处记录的功能: https://github.com/ServiceStack/ServiceStack.OrmLite#custom-sql-customizations

这就是我的使用方式:

var q = Db.From<MemberAccess>().LeftJoin<Member>();
return Db.Select<MemberResponse>(q);

响应对象:

public class MemberResponse
{
    public Guid Id { get; set; }

    public string MemberFirstName { get; set; }

    public string MemberLastName { get; set; }

    public string MemberEmail { get; set; }

    [Default(OrmLiteVariables.SystemUtc)]
    public string AccessedOn { get; set; }

    [CustomSelect("CONCAT(LEFT(Member.FirstName, 1),LEFT(Member.LastName,1))")]
    public string MemberInitial { get; set; }
}

似乎我在 CustomSelect 中放入的任何内容都没有被使用。
也许,我没有正确使用它?
另外,默认属性也不起作用。
我试过了,因为它是文档中的一个示例。

任何想法都会受到赞赏。

提前致谢。

【问题讨论】:

    标签: ormlite-servicestack


    【解决方案1】:

    [CustomSelect] 仅适用于源表。选择自定义类型的结果用于将返回的结果集映射到 MemberResponse 类型,它对执行的查询没有任何影响

    同样[Default(OrmLiteVariables.SystemUtc)]用于定义创建表时的默认值,仅在创建列定义时使用,所以它只对源表类型有用。

    这两个属性只能添加到源MemberAccess 上才能产生任何效果,您映射的MemberResponse 可以在没有任何属性的情况下访问,例如:

    public class MemberResponse
    {
        public Guid Id { get; set; }
    
        public string MemberFirstName { get; set; }
    
        public string MemberLastName { get; set; }
    
        public string MemberEmail { get; set; }
    
        public string AccessedOn { get; set; }
    
        public string MemberInitial { get; set; }
    }
    

    Sql.Custom() API

    v4.5.5 中添加的新 Sql.Custom() API available on MyGet 将允许您选择自定义 SQL 片段,例如:

    var q = Db.From<MemberAccess>().LeftJoin<Member>()
      .Select<MemberAccess,Member>((a,m) => new {
        Id = a.Id,
        MemberFirstName = m.FirstName,
        MemberLastName = m.LastName,
        MemberEmail = m.Email,
        MemberInitial = Sql.Custom("CONCAT(LEFT(Member.FirstName,1),LEFT(Member.LastName,1))")
      });
    return Db.Select<MemberResponse>(q);
    

    【讨论】:

    • 啊,好吧,如果我只想在与另一个表连接时包含它,我将如何使用 CustomSelect?我不希望它成为源的一部分,因为该字段仅在与另一个表连接时才可用。或者也许这不是这个用例的正确解决方案?
    • @vonec [CustomSelect] 仅用于源表。您可以使用自定义 .Select(customSql) 或者在这种情况下我只需要一个 C# getter,例如:MemberInitial =&gt; MemberFirstName.Substring(0,1) + MemberLastName.Substring(0,1)
    • @vonec 查看更新的答案,例如新的Sql.Custom() API,它允许您将自定义 SQL 片段选择到别名列中。
    • @mythz 当您说 CustomSelect 仅适用于排序表时,这是否意味着它不能用于带有连接的 Db.From?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 2013-01-19
    相关资源
    最近更新 更多