我为自己创建了一个 ExpressionBuilder 类,它可以帮助我在执行 Linq to Sql 查询时将可用作谓词的表达式组合在一起。它工作得很好。但是,我刚刚发现表达式只能用于过滤表,而不是实体集?为什么会这样?
例如,如果我有公司和有薪水的员工。我可以创建这两个表达式:
Expression<Func<Company, bool>> cp = x => x.Name.StartsWith("Micro");
Expression<Func<Employee, bool>> ep = x => x.Name.StartsWith("John");
然后我希望能够执行以下操作,但是它仅部分有效:
var companies = dataContext.Companies
.Where(cp) // Goes fine
.Select(x => new
{
x.Name,
SumOfSalaries = x.Employees
.Where(ep) // Causes compile-time error
.Sum(y => y.Salary),
}
.ToList();
此外,如果我执行ep.Compile()
它会编译,但是在运行查询时会出现错误。
为什么会这样?我错过了什么吗?我觉得这不合逻辑。我能以某种方式解决这个问题吗?或者你有什么好的解决方法?
我知道在这种情况下我可以Where(x => x.Name.StartsWith("John"))
改用,但问题是我需要的表达式并不是那么微不足道。它们是较长的AndAlso
s 和OrElse
s 字符串。