C# C linq select与lambda select之间的差异

C# C linq select与lambda select之间的差异,c#,linq,C#,Linq,我使用EF db上下文进行了此测试查询 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(); /

我使用EF db上下文进行了此测试查询

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方式选择和Linq方式选择之间的区别

谢谢

*编辑

让我们说目标实际上是拥有

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。

选择查询运算符使用表达式求值,而不是lambda


因此,您的代码将生成一个lambda列表。

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

有关更多信息,请阅读

在一些场景中,lambda可以用于匿名方法,并且不会被威胁为LINQ,比如

编辑-问题更新

或者,根据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();

这不是运行时错误。选择qry->selectqryitem@PetSerAl对不起,你能再解释一下吗?你是说我应该用Expressionright,我做了一些编辑,仍然试图看看是否有可能使'Select'可用于其他查询。由于您的qry是一个表达式,而不是lambda,您应该按照PetSerAl的建议将其应用于类似Select qryitem的内容。因此,基本上简短的回答是不可行的,因为我正在尝试包装'Select'不是吗?是的,你不能随心所欲不幸的是,你不得不在表达式中引用目标项来应用它:select操作符想要一个表达式进行求值。这对于select查询操作符来说是悲哀的,尽管我仍然想知道为什么。Selectqry有效。
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();