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);