如何在linq查询中连接表达式

时间:2013-12-26 19:57:39

标签: c# linq entity-framework nhibernate ado.net

我有以下代码来创建表达式:

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方法中使用joinlet命令。

此查询将在NHibernate的数据库中执行。

如何在Expression<Func<T, bool>>查询中连结Linq

谢谢。

1 个答案:

答案 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查询应该可以工作。