Subsonic 亚音速生成代码并始终过滤记录

Subsonic 亚音速生成代码并始终过滤记录,subsonic,subsonic-active-record,Subsonic,Subsonic Active Record,我有一个名为Users的表,它有一个名为deleted的列,这是一个布尔值,表示用户已从系统中删除,当然没有实际删除它 我还有很多表,其中有一个FK到Users.user\u id列。亚音速以类似的方式很好地为所有外键生成代码: public IQueryable<person> user { get { var repo=user.GetRepo(); return from i

我有一个名为Users的表,它有一个名为deleted的列,这是一个布尔值,表示用户已从系统中删除,当然没有实际删除它

我还有很多表,其中有一个FK到Users.user\u id列。亚音速以类似的方式很好地为所有外键生成代码:

    public IQueryable<person> user
    {
        get
        {
              var repo=user.GetRepo();
              return from items in repo.GetAll()
                   where items.user_id == _user_id
                   select items;
        }
    }
虽然这很好,但是否有一种方法可以生成代码,从而始终过滤掉已删除的用户

在这里的办公室里,我们能想到的唯一建议是使用分部类并扩展它。当有很多类使用用户表时,这显然是一种痛苦,更不用说在本例中很容易无意中使用错误的属性User vs ActiveUser:

    public IQueryable<User> ActiveUser
    {
        get
        {
              var repo=User.GetRepo();
              return from items in repo.GetAll()
                   where items.user_id == _user_id and items.deleted == 0
                   select items;
        }
    }

有什么想法吗?

你在用亚音速3吗?如果是这样,则您可以实际编辑模板以修改数据访问层类的生成方式。

您需要更改ActiveRecord.tt文件中的以下代码并重新生成代码:

以下代码位于:区域“外键”

更新:我已经为您的评论更新了代码,用于检查删除列是否可用,然后仅应用删除条件

HasLogicalDelete-如果表已删除或isdeleted列,此函数将返回true,否则返回false

public IQueryable<<#=fk.OtherClass #>> <#=propName #>
{
    get
    {

          var repo=<#=Namespace #>.<#=fk.OtherClass#>.GetRepo();

          <#if(tbl.HasLogicalDelete()){#>

          return from items in repo.GetAll()
               where items.<#=CleanUp(fk.OtherColumn)#> == _<#=CleanUp(fk.ThisColumn)#> && items.deleted == 0
               select items;

          <#}else{#>

          return from items in repo.GetAll()
               where items.<#=CleanUp(fk.OtherColumn)#> == _<#=CleanUp(fk.ThisColumn)#>
               select items;

          <#}#>
    }
}

这正是我想要的答案。我甚至没有想到亚音速可能已经有了这个!