我有以下代码来创建表达式:
Expression<Func<Process, bool>> exp = null;
if (condition)
{
exp = x => x.Hierarchy.StartWith(hierarchy) && x.Level == 2;
}
/*
other conditions that modify the exp variable
*/
else
{
exp = x => x.Hierarchy == hierarchy && x.Level == 3;
}
根据某些条件,此查询可能不同。我将在以下查询中使用此表达式,但是,我想在exp
查询中连接linq
表达式变量,以获取示例:
var query = from p in queryable
join c in confQueryable on p.Id equals c.Id
where p.ParentId == parentProcessId && exp // AND exp here...
let hasChild = p.Processes.Any()
select new ViewModel
{
Code = p.Code,
Text = string.Format("{0}: {1}", c.Name, p.Name), // use c variable
ParentId = p.Id,
Value = p.Id.ToString(),
HasChildren = hasChild, // use hasChild variable
};
我无法将其转换为linq方法,因为我返回ViewModel
而不是实体。如果我这样做,我不知道如何在linq方法中使用join
和let
命令。
此查询将在NHibernate的数据库中执行。
如何在Expression<Func<T, bool>>
查询中连结Linq
?
谢谢。
答案 0 :(得分:1)
为什么你不能使用像这样的链式方法
var query =
queryable
.Where(exp)
.Join(confQueryable, p => p.Id, c => c.Id, (p, c) => new {p, c})
.Where(@t => p.ParentId == parentProcessId)
.Select(@t => new {@t, hasChild = p.Processes.Any()})
.Select(@t => new ViewModel
{
Code = p.Code,
Text = string.Format("{0}: {1}", c.Name, p.Name), // use c variable
ParentId = p.Id,
Value = p.Id.ToString(),
HasChildren = hasChild, // use hasChild variable
});
我不知道nHibernate,但对于Entity Framework,这样的linq查询应该可以工作。