C# SQL不在Linq中

C# SQL不在Linq中,c#,sql,linq,nhibernate,linq-to-sql,C#,Sql,Linq,Nhibernate,Linq To Sql,我有一个(Oracle)SQL查询,我想将其转换为Linq,以便在NHibernate上下文中使用。 查询的作用是获取已从给定模块中删除的所有函数(即,它们不存在于给定的模块中,但链接到前置模块) 下面是一幅解释数据模型的图片 我正在寻找一个带有“点符号”的表达式,类似于: DBContext.GetAll<Function>() .Where(x => x.Module.ModID == module.PredecessorID)... DBContext.Get

我有一个(Oracle)SQL查询,我想将其转换为Linq,以便在NHibernate上下文中使用。 查询的作用是获取已从给定模块中删除的所有函数(即,它们不存在于给定的
模块中,但链接到前置模块)

下面是一幅解释数据模型的图片

我正在寻找一个带有“点符号”的表达式,类似于:

DBContext.GetAll<Function>()
    .Where(x => x.Module.ModID == module.PredecessorID)...
DBContext.GetAll()
。其中(x=>x.Module.ModID==Module.PredecessorID)。。。

您可以分两步完成此操作(为了可读性)

var excludedNames=DbContext.GetAll()
.Where(x=>x.ModeID==module.ModID)
.选择(x=>x.FncName);
var result=DBContext.GetAll()
.其中(x=>x.Module.ModID==Module.PredecessorID&&
!excludedNames.Contains(x.FncName));

我想我可以,但我希望NHibernate不能将其仅转换为一个SQL表达式,这将是更好的选择。(至少如果你觉得这样可以节省一些计算时间,对吗?@Markus:如果你不枚举第一个查询,这将转换为一个sql,而不是两个。不枚举吗?你的意思是像
var excludedNames
而不是
List excludedNames=..ToList()
?嗯,你可以使用var,是的。无论如何,如果不在末尾放一个.ToList(),它是一个
IEnumerable
而不是
列表(我们只选择
FncName
,因此它不再是
函数的集合。
DBContext.GetAll<Function>()
    .Where(x => x.Module.ModID == module.PredecessorID)...
var excludedNames = DbContext.GetAll<Function>()
                             .Where(x => x.ModeID == module.ModID)
                             .Select(x => x.FncName);

var result = DBContext.GetAll<Function>()
                      .Where(x => x.Module.ModID == module.PredecessorID &&
                                  !excludedNames.Contains(x.FncName));