C# Joins/Where with Linq 和 Lambda 如何返回列表<T>



下面的查询运行良好,并返回一个与预期完全相同的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)

这能回答你的问题吗?如果没有,请提供一个我们可以编译和运行的小程序,清楚地再现了问题。

最新更新