我使用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
。
答案 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();