C# 子查询中的NHibernate IQueryable.SingleOrDefault。使用函数谓词而不执行

C# 子查询中的NHibernate IQueryable.SingleOrDefault。使用函数谓词而不执行,c#,linq,nhibernate,C#,Linq,Nhibernate,我有一个查询 SpecialAttributes是一个IEnumerable q = from c in q let x = c.SpecialAttributes.Where(a => a.Attribute.Id == id) .Select(z => z.AttribValue).SingleOrDefault() orderby Convert.ToDateTime(x) sel

我有一个
查询

SpecialAttributes
是一个
IEnumerable

 q = from c in q
     let x = c.SpecialAttributes.Where(a => a.Attribute.Id == id)
                                .Select(z =>  z.AttribValue).SingleOrDefault()
     orderby Convert.ToDateTime(x)
     select c;
我需要立即执行sql查询

但是在这种情况下,每个
SingleOrDefault()
都将与主查询分开执行

如果提取结果的计数为100-
SingleOrDefault()
将执行100次


如何在一个查询中实现这一点,如
futuresinglerdefault()

假设特殊属性集合中没有具有相同id的属性,并且“SpecialAttribute”类具有对父对象的引用,这可能会起作用:

q.SelectMany(x => x.SpecialAttributes)
 .Where(x => x.Attribute.Id == id)
 .OrderBy(x => Convert.ToDateTime(x.AttribValue))
 .Select( x => x.Parent )
 .Distinct();
我不知道EF是否会将Convert.ToDateTime()解析为正确的t-sql语句。如果不是,您可以在内存中执行(如果集合不是很大):


工作。但有一个小问题。当
x.Parent
将有一个空的SpecialAttributes时,它不属于fetch。我在表中显示
x.Parent
,不能跳过没有属性的记录。需要显示所有记录,包括带有空SpecialAttributes的
x.Parent
。解决方法是添加联合(q.Where(x=>x.SpecialAttributes==null))或类似的内容。它将通过两个查询来解决,远远优于之前的select n+1。无论如何,我会一直考虑一个更好的方法…关于这个:q=from c in q let x=(from a in c.SpecialAttributes其中a.Attribute.Id==Id选择new{z.AttribValue});两件事:我在下面将代码更改为100%linq样式,并将SingleOrDefault()更改为FirstOrDefault()。我认为最后一部分可以奏效
q.SelectMany(x => x.SpecialAttributes)
 .Where(x => x.Attribute.Id == id)
 .Select( x => new { Parent = x.Parent, Value = x.AttribVale} )
 .Distinct()
 .OrderBy(x => Convert.ToDateTime(x.Value))
 .Select(x => x.Parent);