我有这个,
Expression<Func<MyCourse, bool>> filter = mc => mc.Active == 1;
Func<MyCourse, bool> funcWhere = filter.Compile();
然后这个,
var myClasses = db.MyCourse.Join(db.People, mc => mc.PersonId,
p => p.PersonId, (mc, p) => new { MyCourse= mc, Person = p }).Where(???)
我需要这样做的原因是,如果我首先在mycourse表上放置过滤器,
db.MyCourse.Where(funcWhere).Join....
创建的SQL返回所有人员和所有mycourse,然后使用过滤器。如果我在最后的地方,
(mc, p) => new { MyCourse= mc, Person = p }).Where(mc=>mc.MyCourse.Active == 1)
我对联接有一个很好的查询。否则,引擎会先将所有行查询到内存中。两个具有数千行的独立查询。
关于这一点,我看到了很多关于SO和其他方面的问题。当一个联接中有多个表时,使用动态
Where Expression<Func<T,TResult>>
.
目的是基于表达式(而不是
Dynamic Linq
,而不是第三方。)事实上,这个问题声称结尾的位置比较慢,但在我的程序中,它使用连接执行正确的查询。
mycourse有一个personid,而people有一个personid。如果我用手写的话,看起来就像,
select mc.CourseName, p.LastName
from MyCourse mc inner join Person p on mc.PersonId = p.PersonId
where mc.Active = 1;
(这些只是问题的示例列。除了active==1),它们实际上不是我从上面的查询中想要的。
Where clause with Join in lambda expression
更新:fwiw,我能让它工作这个,
var param = Expression.Parameter(typeof(MyClass), "MyClassDebug");
var exp = Expression.Lambda<Func<MyClass, bool>>(
Expression.Equal(
Expression.Property(param, dbParameter),
Expression.Constant(dbValue)
),
param
);
我没有做导航属性或其他任何事情。我能像这样使用它,
var MyQuery = (from recs in dbcontext.MyClass.Where(exp)
...three joins
生成的SQL看起来不错,并且解释计划显示最少的行检索。