【问题标题】:How to use orderby from another table column with C# lambda expression如何使用带有 C# lambda 表达式的另一个表列中的 orderby
【发布时间】:2016-08-09 11:15:04
【问题描述】:

我有两个表,我需要使用 lambda 表达式从第二个表中订购数据。

例如:表 A 与表 B 以一对多的关系链接。表A的主键将是表B中的外键。我需要从表中获取数据并按表B日期时间列排序。有人可以给我一个想法吗?谢谢。

A.cs文件有这段代码,

public partial class A
{
    public A()
    {
      this.B = new HashSet<B>();
    }
    public virtual ICollection<B> B { get; set; }
}

B.cs文件有这段代码,

public partial class B
{
    public Nullable<long> a_pk { get; set; }
    public Nullable<System.DateTime> system_date_time { get; set; }    
    public virtual A A { get; set; }
}

在模型中,cs文件有这样的代码。谢谢

【问题讨论】:

  • 你能分享你的模型的代码吗?
  • 你是不是错过了IdA。而且 - a_pk 是一个外键 - 那么它怎么可能是空的呢?
  • @smoksnes 代码已添加到问题中。谢谢。
  • @GiladGreen 是的。 a_pk 是类主键。对不起,我忘记添加它。谢谢
  • @vishwa - 基本上 1. 你想要升序还是降序。 2.你要选择什么数据?只有一个? A和B? 3. If only A then Order asc or desc by Max/Min/What B?

标签: c# asp.net-mvc entity-framework lambda sql-order-by


【解决方案1】:

它可能效率不高,但你可以这样做:

// Sample data
var collection = new List<A>
{
    new A()
    {
        B = new List<B>
        {
            new B { system_date_time = DateTime.Now.AddHours(-1) },
            new B { system_date_time = DateTime.Now.AddHours(-2) },
            new B { system_date_time = DateTime.Now.AddHours(-3) },
        }
    },
    new A()
    {
        B = new List<B>
        {
            new B { system_date_time = DateTime.Now.AddDays(-1) },
            new B { system_date_time = DateTime.Now.AddDays(-2) },
            new B { system_date_time = DateTime.Now.AddDays(-3) },
        }
    },
    new A()
    {
        B = new List<B>
        {
            new B { system_date_time = DateTime.Now.AddYears(-1) },
            new B { system_date_time = DateTime.Now.AddYears(-2) },
            new B { system_date_time = DateTime.Now.AddYears(-3) },
        }
    }
};


var sorted = collection.OrderByDescending(x => x.B.Max(y => y.system_date_time));

SQL 将是这样的:

Select 
    *,
    (SELECT 
        MAX([Extent2].[system_date_time]) AS [A1]
        FROM [dbo].[B] AS [Extent2]
        WHERE [Var_38].[a_pk ] = [Extent2].[a_pk ]) AS [C1]
    FROM [dbo].[A] AS [Var_38]
)  AS [Project1]
ORDER BY [C1] ASC

如果你想要A 并包含B,那么你可以这样做:

var result = _context.YourATable.Include(x => x.B).OrderByDescending(x => x.B.Max(y => y.system_date_time));

【讨论】:

  • @smoksness 谢谢。我也会检查一下。
  • @GiladGreen,感谢您的编辑,但现在所有B 都具有相同的system_date_time,这使得验证结果变得更加困难。
  • @smoksnes - 哦,对不起,我错过了。看到了减去的时间,但可能错过了其余的时间
  • @smoksnes include 和 max thing 解决了这个问题。谢谢大佬
【解决方案2】:

这对我有用。

var result = _context.A.Include(x => x.B).OrderByDescending(x => x.B.Max(y => y.system_date_time));

谢谢大家

【讨论】:

    【解决方案3】:

    查询语法:

    var result = from a in db.A
                 join b in db.B on a.a_pk equals b.a_pk
                 orderby b.system_date_time descending
                 select new { a, b }
    

    方法语法:

    var result = db.A.join(db.B,
                           a => a.a_pk,
                           b => b.a_pk,
                           (a,b) => new { a, b })
                     .OrderByDescending(item => item.b.system_date_time); 
    

    如果您只想从A 中获取项目,那么 Smoksnes 的答案就是要走的路

    【讨论】:

    • @Gillad Green 谢谢我会试试这个
    【解决方案4】:

    您可以使用 SelectMany 来展平内部集合,然后只需遍历普通集合并获取您需要的所有信息。 检查this fiddle 的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      • 1970-01-01
      相关资源
      最近更新 更多