如何使用C#lambda表达式从另一个表列中使用orderby

时间:2016-08-09 11:15:05

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

我有两个表,我需要使用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文件包含这样的代码。谢谢

4 个答案:

答案 0 :(得分:2)

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

// 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));

答案 1 :(得分:2)

这对我有用。

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

全部谢谢

答案 2 :(得分:1)

查询语法:

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的回答是可行的方式

答案 3 :(得分:1)

您可以使用SelectMany来压缩内部集合,然后迭代普通集合并获取所需的所有信息。 检查this小提琴代码。