1

Benefit と SchemeName の 2 つのモデルがあります。

利点 -

[Key]
public int BenefitID { get; set; }
public string BenefitName { get; set; }
public string BenefitDescription { get; set; }
public virtual ICollection<SchemeName> SchemeNames { get; set; }

スキーム名

[Key]
public int SchemeNameID { get; set; }
public string Name { get; set; }
public virtual ICollection<Benefit> Benefits { get; set; }

これにより、Benefits データベースに 3 つのテーブル、SchemeNames と、SchemeNameBenefits という結合テーブルが作成されました。

特定の特典に関連付けられたスキーム名のみを含むドロップダウン リストを作成しようとしていますが、どうすればよいかわかりません。コードで結合テーブルを参照できますか?

私は以下から始めました(これはすべてのSchemeNameを返します)

private void PopulatePensionSchemeName(object selectedPensionSchemeName = null)
        {
            var schemeNameQuery = from d in db.SchemeNames
                                  orderby d.SchemeNameID
                                  select d;

            ViewBag.PensionSchemeNameID = new SelectList(schemeNameQuery, "SchemeNameID", "Name", selectedPensionSchemeName);
        }

しかし、この句を追加する方法がわかりません。ポインタはありますか?

4

3 に答える 3

2

SchemeNames が必要な Benefit オブジェクトのキーが必要です。おそらく探しているクエリは次のとおりです。

var benefitId = // However you get your benefit Id

var schemaNameQuery = from b in db.Benefits
                      from s in b.SchemeNames
                      where b.BenefitId == benefitId
                      select s;

または拡張メソッドの構文で:-

var schemaNameQuery = db.Benefits.Where(b.BenefitId == benefitId)
                                 .SelectMany(b => b.SchemeNames);

これにより、次のSQLが生成されます:-

SELECT ...
FROM [dbo].[SchemeNameBenefits] AS [Extent1]
INNER JOIN [dbo].[SchemeNames] AS [Extent2]
  ON [Extent1].[SchemeName_Id] = [Extent2].[SchemeNameId]
WHERE [Extent1].[Benefit_Id] = @p__linq__0

または、次を使用できます:-

var benefitId = // However you get your benefit Id

var schemeNameQuery = from d in db.SchemeNames
                      where d.Benefits.Any(x => x.Id == benefitId)
                      orderby d.SchemeNameId
                      select d;

これにより、次の SQL が生成されます。

SELECT ...
FROM ( SELECT ... FROM [dbo].[SchemeNames] AS [Extent1]
       WHERE EXISTS (SELECT 1 AS [C1]
                     FROM [dbo].[SchemeNameBenefits] AS [Extent2]
                     WHERE ([Extent1].[SchemeNameId] = [Extent2].[SchemeName_Id])
                     AND ([Extent2].[Benefit_Id] = @p__linq__0)))
AS ...
ORDER BY [Project2].[Id] ASC

どちらの場合も、EF モデルの一部ではありませんが、生成された SQL はジャンクション テーブルを参照することに注意してください。

もちろん、Benefit オブジェクトを既に持っている場合は、次を使用してより簡単にその SchemeNames を取得できます。

var schemeNameQuery = benefit.SchemeNames;
于 2012-11-06T10:23:11.777 に答える
1

ジャンクション テーブルを使用してこれを行います。ジャンクション テーブルは結合テーブルです。これは、SchemeNameID と BenefitID の 2 つの外部キーで構成されます。

ジャンクション テーブルの詳細については、次の Web サイトをご覧ください。

http://megocode3.wordpress.com/2008/01/04/understanding-a-sql-junction-table/

とても助かりました。

于 2012-11-06T10:23:23.770 に答える
1

[免責事項] 条件付きで、SchemeNameBenefits モデルが存在するか追加されている場合は、次のように動作するはずです。

したがって、SchemeNameBenefits テーブルは多対多のマップのようです。この場合、特典 ID を使用してスキーム ID のコレクションを取得します。

var schemeIds = db.SchemeNamesBenefits.Where(map => map.BenefitID == id)
                                      .Select(map => map.SchemeNameID).ToArray();

次に、これらのスキーム ID のすべてのスキーム名情報を取得します。

var result = db.SchemeNames.Where(scheme => schemeIds.Contains(scheme.SchemeNameID))
                           .OrderBy(scheme => scheme.SchemeNameId)
                           .Select(scheme => scheme.Name).ToArray();

または1つのクエリで

 var result = db.SchemeNamesBenefits.Where(map => map.BenefitID == id)
                                    .SelectMany(map => db.SchemeNames
                                                         .Where(scheme => map.SchemeNameID == scheme.SchemeNameID)
                                                         .OrderBy(scheme => scheme.SchemeNameId)
                                                         .Select(scheme => scheme.Name)
                                                         .AsEnumerable())
                                    .ToArray()
于 2012-11-06T10:25:32.023 に答える