1

我有 2 个表:POHeader 和 PODetail。我想返回所有具有关联 PODetail.ItemId = intItemId 的 POHeaders。我怎样才能在 LINQ 中做到这一点?

这是我尝试过的。

首先,我的存储库中有一个方法,它使用 Include 参数包含 PODetails:

public IQueryable<POHeader> SearchForWithDetails(int intFacilityId)
{
    return DbSet.Include("PODetails").Where(x => x.FacilityId == intFacilityId);
}

然后将结果传递给:

public IQueryable<POHeader> SearchForPODetailsByItemId(IQueryable<POHeader> poHeaders, int intItemId)
{
    //This returns a type of PODetail not POHeader
    var q = poHeaders.SelectMany(c => c.PODetails).Where(c => c.ItemId == intItemId);

    //In this case, I can't figure out the syntax :(
    var p = from poHeader in poHeaders
            let filteredPOs = from poDetail in poHeader.PODetails
            where poDetail.ItemId == intItemId
            select ????
    return p;
}

这样做的正确方法是什么?

此外,我可以预见需要 2 个结果:

  1. 只返回一个 IQueryable
  2. 返回连接表结果。
4

2 回答 2

3

试试这个;

var result = poHeaders.Where(e => e.PODetails.Any(a => a.ItemId == intItemId)); 
于 2013-01-17T01:09:02.693 回答
1

假设您的 Header->Detail 是一对多的关系,并且 Detail 有一个导航回到它的标题,称为 .Header:

public IQueryable<POHeader> SearchForPODetailsByItemId(IQueryable<POHeader> poHeaders, int intItemId)
{
    var headersForThisItem = poHeaders.SelectMany(pod => pod.PODetails).Where(pod => pod.ItemId == intItemId)
        .Select(pod=> pod.Header).Distinct();//.Distinct to eliminate duplicates when 2 Details have the same header.  Not necessary if ItemId filter naturally provides distinct results.

    return headersForThisItem ;
}

未经测试,但我认为这会给你你想要的。

于 2013-01-17T01:09:44.373 回答