linq select与lambda select

时间:2017-12-25 18:25:32

标签: c# linq

我使用EF db context进行了此测试查询。

Func<Item, ItemDto> qry = x => new ItemDto() {
  Id = x.Id,
  Name = x.Name
};
List<ItemDto> test1 = db.Items.Select(qry).ToList(); // works
List<ItemDto> test2 = (from item in db.Items select qry).ToList(); // run-time error

我的运行时错误

Cannot implicitly convert type 'System.Collections.Generic.List<System.Func<Progam.Item, Progam.ItemDto>>' to 'System.Collections.Generic.List<Progam.ItemDto>'

首先,我不关注错误,而是想知道Lambda-way Select和Linq-way选择Reference to NikolaiDante's answer之间的区别。

谢谢!

*修改

让我们说目标实际上是像

那样
Func<Item, ItemDto> qry = x => new ItemDto() {
      Id = x.Id,
      ItemCode = x.ItemCode
    };

var qry1 = (from p in db.Sales
            select new SaleDto() { 
                TranNo = p.TranNo
                , ExtItem = (from p1 in db.Items.Where(p2 => p2.ProductCode == p.ItemCode) 
                            select qry).FirstOrDefault()
}).ToList();

var qry2 = (from p in db.Returns
            select new ReturnDto() { 
                TranNo = p.TranNo
                , ExtItem = (from p1 in db.Items.Where(p2 => p2.ProductCode == p.ItemCode) 
                             select qry).FirstOrDefault()
}).ToList();

这可行吗?我确定我在这里做错了,可能是一些更好的解决方案吗?

注意:我在这里尝试做的是一次性查询,并避免在查询后使用foreach

2 个答案:

答案 0 :(得分:1)

select查询运算符使用表达式来计算,而不是lambda。

因此,您的代码会生成一个lambdas列表。

答案 1 :(得分:0)

一般来说,它们都属于LINQ框架,它们的性能是相同的,因为编译器会在程序集生成时将任何查询语法转换为方法语法(尽管它可能会选择稍微不同的解释来复杂查询)。

有关详情,请参阅this

在某些情况下,lambdas可用于匿名方法,并且不会被LINQ威胁,例如lambda expressions

编辑 - 问题更新

var qry2 = (from p in db.Returns
            select new ReturnDto()
            { 
                TranNo  = p.TranNo,
                ExtItem = (from p1 in db.Items.Where(p2 => p2.ProductCode == p.ItemCode)
                           select new ItemDto()
                           {
                               Id = p1.Id,
                               ItemCode = p1.ItemCode
                           })
                           .FirstOrDefault()
            })
            .ToList();

或者,基于你的lambda表达式:

var qry2 = (from p in db.Returns
            select new ReturnDto()
            { 
                TranNo  = p.TranNo,
                ExtItem = (from p1 in db.Items.Where(p2 => p2.ProductCode == p.ItemCode)
                           select qty(p1)).FirstOrDefault()
            })
            .ToList();