C#与Linq和Lambda联合Where如何返回List<;T>;
本文关键字:List 返回 lt gt Linq Lambda 联合 何返回 Where | 更新日期: 2023-09-27 17:58:35
下面的查询运行良好,并返回一个与预期完全相同的List<>
List<purchaseOrderHeaderEntity> details = (from p in
db.purchaseOrderDetailEntity join r in db.purchaseOrderHeaderEntity on
p.purchaseOrderID equals
r.purchaseOrderID
where p.productID == productID select r).ToList();
如果我使用lambda重写它,它会返回两个列表:
List<purchaseOrderHeaderEntity> lambda_details = db.purchaseOrderDetailEntity.Join(db.purchaseOrderHeaderEntity,
p => p.purchaseOrderID,
r => r.purchaseOrderID,
(p, r) => new { Detail = p, Header = r }).Where(DetailAndHeader => DetailAndHeader.Detail.productID == productID).ToList();
如果我从选择部分中删除"Detail=p
",Join将抛出错误
"无法根据用法推断方法…的类型参数。请尝试显式指定类型参数。"
有没有一种方法可以重写该查询,使其只返回一个Header列表?
提前感谢!
您可以在联接之前放置where条件,然后返回r.
var lambda_details = db.purchaseOrderDetailEntity
.Where(detailAndHeader => detailAndHeader.Detail.productID == productID)
.Join(db.purchaseOrderHeaderEntity,
p => p.purchaseOrderID,
r => r.purchaseOrderID,
(p, r) => r).ToList();
您的查询理解和流畅的查询是不同的查询。
您的查询理解表达式为:
from p in db.purchaseOrderDetailEntity
join r in db.purchaseOrderHeaderEntity on
p.purchaseOrderID equals r.purchaseOrderID
where p.productID == productID
select r
你流利的形式是:
db.purchaseOrderDetailEntity.
Join(
db.purchaseOrderHeaderEntity,
p => p.purchaseOrderID,
r => r.purchaseOrderID,
(p, r) => new { p, r }).
Where(pr => pr.p.productID == productID)
但正确的流畅形式是
db.purchaseOrderDetailEntity.
Join(
db.purchaseOrderHeaderEntity,
p => p.purchaseOrderID,
r => r.purchaseOrderID,
(p, r) => new { p, r }).
Where(pr => pr.p.productID == productID).
Select(pr => pr.r)
这能回答你的问题吗?如果没有,请提供一个我们可以编译和运行的小程序,清楚地再现了问题。