【发布时间】:2011-02-20 07:46:24
【问题描述】:
我一直使用这些常见的 EntityObjectFilters 作为“管道和过滤器”的方式来从集合中查询具有 ID 的特定项目:
public static class EntityObjectFilters
{
public static T WithID<T>(this IQueryable<T> qry,
int ID) where T : IEntityObject
{
return qry.SingleOrDefault<T>(item => item.ID == ID);
}
public static T WithID<T>(this IList<T> list,
int ID) where T : IEntityObject
{
return list.SingleOrDefault<T>(item => item.ID == ID);
}
}
..但我想知道:“我可以通过为所有 IEnumerable<T> 类型创建一个扩展来简化这个吗?
所以我想出了这个:
public static class EntityObjectFilters
{
public static T WithID<T>(this IEnumerable<T> qry,
int ID) where T : IEntityObject
{
return qry.SingleOrDefault<T>(item => item.ID == ID);
}
}
现在,虽然这个 似乎 会产生相同的结果,但我想知道当应用于 IQueryable<T>s 时,表达式树是否会被传递给 LinqToSql 以作为 SQL 代码进行评估或 我的qry 会先被完整地评估,然后用Funcs 迭代吗?
我怀疑(根据Richard's answer)后者将是真的,这显然是我不想要的。我想要相同的结果,但延迟 SQL 执行对IQueryable<T>s 的额外好处。有人可以为我确认实际会发生什么并提供简单的解释来说明它是如何工作的吗?
编辑:
我采用的解决方案
public static T WithID<T>(this IEnumerable<T> qry,
int ID) where T : DomainBase
{
if (qry is IQueryable<T>)
return ((IQueryable<T>)qry).SingleOrDefault<T>(item => item.ID == ID);
else
return qry.SingleOrDefault<T>(item => item.ID == ID);
}
【问题讨论】:
标签: linq-to-sql extension-methods ienumerable expression-trees iqueryable