[英]What is the Efficiency and Performance of LINQ and Lambda Expression in .Net?
[英].NET LINQ IQueryable: what is `Expression` for?
我正在使用LINQ提供程序,因此正在實現IQueryable。
此接口中Expression
屬性的目的是什么? 我通常只是從實現中返回類似Expression.Constant(this)
類的東西,但是不知道這是否不好。
文檔奇怪地指出:“這允許框架區分LINQ查詢和Entity SQL查詢”。
該IQueryable.Expression
部件被反饋到IQueryProvider
所有的各種Queryable.*
經營者”( .Where()
.Select()
.Join()
,...),如:
public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate) {
if (source == null)
throw Error.ArgumentNull("source");
if (predicate == null)
throw Error.ArgumentNull("predicate");
return source.Provider.CreateQuery<TSource>(
Expression.Call(
null,
((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)),
new Expression[] { source.Expression, Expression.Quote(predicate) }
));
}
(摘自參考源 )
通常,它應該是整個表達式。
顯然,如果您通過Expression.Constant()
直接傳遞對IQueryable
類的完整引用,沒有人會殺了您,但是我確實認為這不是“粗俗”。
將“真實”表達式放入Expression
(就像由Enumerable.AsQueryable()
,EF和LINQ-to-SQL來完成,僅舉三個IQueryable
提供程序一樣)的目的是,其他外部類可以自由地分析和以與Queryable.Where
相同的方式操作Expression
並將其反饋給提供者
Expression expression = source.Expression;
// here "expression" is manipulated
return source.Provider.CreateQuery<SomeType>(expression);
舉個例子...有一些“查詢修復程序”可以修改查詢,例如https://github.com/davidfowl/QueryInterceptor (查詢的通用修飾符)或https://github.com/hazzik/ DelegateDecompiler ,它允許執行以下操作:
var employees = (from employee in db.Employees
where employee.FullName == "Test User"
select employee).Decompile().ToList();
FullName
不在數據庫中映射,並且是類似以下屬性的屬性:
class Employee
{
[Computed]
public string FullName
{
get { return FirstName + " " + LastName; }
}
(將FirstName
和LastName
映射到數據庫)。 DelegateDecompiler從IQueryable
獲取Expression
,搜索具有Computed
屬性的屬性,對其進行反編譯,然后將反編譯的代碼(轉換為表達式樹)放回到IQueryable.Expression
(盡管使用IQueryable.Provider.CreateQuery()
)
如果要保存其他數據,可以將其放在Provider
:可以在CreateQuery
方法中生成IQueryProvider
類的新實例。 也是由Queryable.*
運算符反饋的(因為CreateQuery<>
是source.Provider
的實例方法)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.