1

POHeader と PODetail の 2 つのテーブルがあります。関連する 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 が 1 対多の関係であり、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 に答える