【问题标题】:Convert Linq to Sql Expression to Expression Tree将 Linq 转换为 Sql 表达式到表达式树
【发布时间】:2011-03-07 21:23:00
【问题描述】:

任何人都可以将这个简单的 LINQ-to-SQL 转换为表达式树吗:

List<Region> lst = (from r in dc.Regions
                    where r.RegionID > 2 && r.RegionDescription.Contains("ern")
                    select r).ToList();

【问题讨论】:

    标签: linq-to-sql c#-4.0 expression expression-trees


    【解决方案1】:

    应该这样做:

    var query = dc.Regions.AsQueryable();
    
    ParameterExpression pe = Expression.Parameter(typeof(Region), "region");
    
    Expression id = Expression.PropertyOrField(pe, "RegionID");
    Expression two = Expression.Constant(2);
    Expression e1 = Expression.GreaterThan(id, two);
    
    Expression description = Expression.PropertyOrField(pe, "RegionDescription");
    MethodInfo method = typeof(string).GetMethod("Contains", new[] {typeof(string)});
    Expression ern = Expression.Constant("ern",typeof(string));
    Expression e2 = Expression.Call(description, method, ern);
    
    Expression e3 = Expression.And(e1, e2);
    
    MethodCallExpression whereCallExpression = Expression.Call(
                    typeof(Queryable),
                    "Where",
                    new Type[] { query.ElementType },
                    query.Expression,
                    Expression.Lambda<Func<Region, bool>>(e3, new ParameterExpression[] { pe }));
    var results = query.Provider.CreateQuery<Region>(whereCallExpression);
    
    List<Region> lst = results.ToList();
    

    要从结果集中仅选择 RegionID,请执行以下操作:

    MethodCallExpression selectExpression = Expression.Call(
                                    typeof(Queryable),                                
                                    "Select",
                                    new[]{ typeof(Region), typeof(int)},
                                    whereCallExpression, 
                                    Expression.Lambda<Func<Region, int>>(id, pe));
    
    var regionIDsQuery = query.Provider.CreateQuery<int>(selectExpression);
    
    List<int> regionIDs = regionIDsQuery.ToList();
    

    【讨论】:

    • 非常感谢。它非常有用。你能介绍一些关于表达式树的文章吗?你是如何掌握表达式树的?谢谢
    • 请编辑您的帖子并将“widget”替换为“ern”。如果我只想选择“RegionID”,您能告诉我该怎么做吗?谢谢
    • @Nima 很高兴我能帮上忙。谢谢你这么说,但我不是Expression Trees 的主人。它们只是一个有趣的结构,我使用它来更好地理解Linq。我当然建议阅读文档,但也可以编写一些标准的Linq 查询,然后检查它们的Expression 属性。这将一点一点地帮助您了解底层机制。我将更新我的答案以包括Select 电话。
    • @Nima 这是一篇很好的示例文章,可以帮助您入门msdn.microsoft.com/en-us/library/bb882637.aspx。如果您还没有,我还建议您下载LinqPad。通过使实验变得如此简单,它确实加快了学习过程。祝你好运!
    • 嗨,朋友。我为“订单”表编写了您的选择调用声明,但我无法选择我的愿望列,例如:OrderID、OrderDate、ShipAddress、RequiredDate。您可以帮我吗?谢谢
    猜你喜欢
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多