【问题标题】:Simple way to use Foreign Key values for sorting?使用外键值进行排序的简单方法?
【发布时间】:2010-05-14 01:09:05
【问题描述】:

免责声明:我最近同时跳到了 C# 2008 和 SubSonic 3 (3.0.0.4)。过去我几乎没有使用过 Linq。

有没有一种简单的方法来使用外键显示值进行排序,而不是 FK Id(它是数字)?

我在我的 ActiveRecord.tt 中添加了一个新的 Find 方法,以帮助基于字符串字段名称进行排序,但经过一些测试后,我意识到即使它应该正常工作,我也没有处理外键字段完全没有(它们只是按值排序)。

即使我需要改变我访问数据的方式,在项目的早期就可以做到这一点。只是在寻找建议。

【问题讨论】:

    标签: subsonic subsonic3 subsonic-active-record


    【解决方案1】:

    LINQ 在这种情况下是你的朋友,你只需要将你的两个对象连接起来,然后根据你的外来对象的属性进行排序:

    var primaryObjectsSorted =
      from primaryObjects in PrimaryObject.All()
      join foreignObjects in ForeignObject.All() 
        on primaryObjects.ForeignId equals foreignObjects.Id
      orderby foreignObjects.PropertyYouWantToSortOn
      select primaryObjects;
    

    【讨论】:

    • 亚当,我昨晚使用了类似的东西,我的问题是我的排序字段和顺序是动态的。这就是为什么我在 activerecord.tt 中制定了一个自定义 Find 方法。我想我可以用 LINQ 代码做同样的事情,但想多了,我认为我的数据库设计可能比这更成问题。我的 FK 可能是(正如 SchlaWiener 所说)在这种情况下也是独一无二的显示字段。但是我确信在某些时候我会遇到我需要更多的情况,而 LINQ 似乎可以处理我需要的 99%。我相信我需要更彻底地考虑这一点。
    【解决方案2】:

    所以你有一个表 B 的 id 作为外键的表 A,你想按表 B 的 DisplayName 列而不是表 B 的 id 对表 A 进行排序?

    实现这一目标的唯一方法是加入。

    SELECT tableA.* FROM tableA INNLER JOIN tableB ORDER BY tableB.DisplayName
    

    在 SubSonic2 中,您可以这样做,并且如果您使用 DB.Select(...).ExecuteCollection() 方法,仍然可以更新您的记录。 我认为 subsonic3 也应该可以做到这一点。

    但是,如果您不使用外键并且显示名称是唯一的,则应该只使用此值作为外键。

    【讨论】:

    • 就我而言,我不需要编辑记录。我正在使用它来填充网格。网格应该支持按单击的字段进行分页和排序(首先是 asc,然后在第二次单击同一字段时为 desc)。在大多数情况下,您建议链接到显示字段而不是 Id 对我有用,尽管在某些情况下它不会。在我决定最好的方法之前,我将看看我所有的选择并做更多的研究。
    猜你喜欢
    • 2015-04-22
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多