c# – LINQ to SQL如何知道委托中的内容?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – LINQ to SQL如何知道委托中的内容?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1704字,纯文字阅读大概需要3分钟。
内容图文
![c# – LINQ to SQL如何知道委托中的内容?](/upload/InfoBanner/zyjiaocheng/911/e8de95744f404578b8bedeca6c4ef07e.jpg)
使用实体框架,我们可以:
MyContext context = ... // a normal EF context
var products = context.Products.Where(p => p.Location == "France") ;
要么
var products = context.Products.Where(p => p.CategoryId == 54) ;
哪些都在它们的等效SQL查询中进行转换.
好的,但在那里的某个地方,有一段代码处理这个:
public static IEnumerable<T> Where(Func<bool, T> func) {
......
}
从那个Where函数,LINQ to SQL如何知道func的实现是什么?
答案可能很明显,但我找不到它.
解决方法:
你应该真正对你的代码做一个转到定义.用于LINQ-to-SQL和Entity Framework的function是
IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
包含在使用expression trees的System.Linq.Queryable中,这是一个能够“描述”代码片段的构造.一个小小的引用:
Expression trees represent code in a tree-like data structure, where each node is an expression, for example, a method call or a binary operation such as x < y.
例如,你的第一个表达式
var products = context.Products.Where(p => p.Location == "France");
由C#编译器转换为此代码:
ParameterExpression par = Expression.Parameter(typeof(Product), "p");
LambdaExpression lambda = Expression.Lambda(
Expression.Equal(
Expression.Property(par, "Location"),
Expression.Constant("France")),
par);
var products = context.Products.Where(lambda);
现在……虽然表达式树的创建非常简单,但反向操作(解构表达式树和创建查询)非常复杂.大头痛复杂.几乎神奇的复杂程度:-)
问题不在于解构表达式树.这很容易.您使用ExpressionVisitor就完成了.问题是合并LINQ查询的各个层并理解程序员想要获得的内容.
我将补充说IL(.NET的“程序集”)足够高,可以对其进行反编译(参见例如IlSpy).至少有一个库,DelegateDecompiler能够将委托反编译为表达式树,因此即使没有表达式树,LINQ-to-SQL和EF也可以使用类似的和反编译的方法直接使用SQL语言.
内容总结
以上是互联网集市为您收集整理的c# – LINQ to SQL如何知道委托中的内容?全部内容,希望文章能够帮你解决c# – LINQ to SQL如何知道委托中的内容?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。