我有Query
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次。
如何在一个查询中执行此操作,例如FutureSingleOrDefault()
?
答案 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);