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

时间:2011-12-12 16:00:35

标签: c# linq nhibernate

我有Query

SpecialAttributesIEnumerable

 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次。

如何在一个查询中执行此操作,例如FutureSingleOrDefault()

1 个答案:

答案 0 :(得分:2)

假设您的特殊属性集合中没有具有相同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语句。如果没有,你可以在内存中进行(如果集合不是很大):

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