如何使用带有 C# lambda 表达式的另一个 table 列的 orderby
How to use orderby from another table column with C# lambda expression
我有两个 table,我需要使用 lambda 表达式从第二个 table 订购数据。
例如:table A 与 table B 建立一对多关系。 table A 的主键将是 table B 中的外键。我需要从 table 获取数据并按 table 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文件有这样的代码。谢谢
查询语法:
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 的回答就是正确的选择
它可能不会很有效,但你可以这样做:
// 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));
您可以使用 SelectMany 来展平内部集合,然后遍历普通集合并获取您需要的所有信息。
检查 this fiddle 代码。
这是对我有用的那个。
var result = _context.A.Include(x => x.B).OrderByDescending(x => x.B.Max(y => y.system_date_time));
谢谢大家
我有两个 table,我需要使用 lambda 表达式从第二个 table 订购数据。
例如:table A 与 table B 建立一对多关系。 table A 的主键将是 table B 中的外键。我需要从 table 获取数据并按 table 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文件有这样的代码。谢谢
查询语法:
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 的回答就是正确的选择
它可能不会很有效,但你可以这样做:
// 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));
您可以使用 SelectMany 来展平内部集合,然后遍历普通集合并获取您需要的所有信息。 检查 this fiddle 代码。
这是对我有用的那个。
var result = _context.A.Include(x => x.B).OrderByDescending(x => x.B.Max(y => y.system_date_time));
谢谢大家