表达式:分解复杂的 linq 查询
本文关键字:linq 查询 复杂 分解 表达式 | 更新日期: 2023-09-27 18:35:24
所以我有一个linq查询,它有几个连接和where子句,并且在投影中它访问其中一个连接。所以,我想分解这个查询以使其可重用,并且已经尝试了各种事情,但无法让它工作。我已经将带有连接的主查询放入另一个类中,并将其作为 IQueryable 返回......但是,由于您必须在最后执行选择,因此 Join 对象以后将不再可用于投影。
我将 where 子句作为表达式放入另一个类中,但是当我想访问连接并将"where"放在其中一个连接上时再次出现问题......因为它们不再可用于 WHERE 子句。
所以,我的问题是...甚至有可能做这样的事情吗?您能否将查询的主要部分(从 x join y join z 中选择 *)重写为表达式并放入另一个文件中,以便以后可以访问该查询的所有部分。
我听说linq只是一系列的表达方式...但也许有更多知识的人可以确认一个人如何做这样的事情?
一个例子是:
var data2 = QueryExtensions.GetEmployeeMeetings(_context, id)
.Where(Expressions.Meetings())
然后在 QueryExtensions 类中,您将拥有
public static IQueryable<table1> GetEmployeeMeetings(EmployeeEntities _context, long id)
{
return (from t in _context.table1
join ed in _context.table2 on t.ID equals ed.ID
join edt in _context.table3 on ed.ID equals edt.ID
select t);
}
最后,在表达式类中
public static Expression<Func<table3, bool>> Meetings()
{
return edt => edt.ID == 5;
}
因此,不幸的是,这不起作用,因为 edt 不再可用于已创建的位置 lambda(因为在主查询中您选择了"t",它只是 table1。显然,我不想仅仅为了能够做这样的事情而返回所有数据......我只想知道是否可以像这样分解查询,然后将它们重新组合在一起?
好的,
我想我只是通过创建这三个表的连接类(如下所示)然后返回它而不仅仅是"t"来解决这个问题......似乎工作正常
public class Jointclass
{
public table1 c1 { get; set; }
public table2 c2 { get; set; }
public table3 c3 { get; set; }
}