1

我有两个模型,Benefit 和 SchemeName

益处 -

[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、SchemeNames 和一个名为SchemeNameBenefits 的连接表中创建了三个表。

我正在尝试填充一个下拉列表,其中仅包含与某个 Benefit 关联的 SchemeNames,但我不确定如何执行此操作,我可以在我的代码中引用连接表吗?

我从以下开始(返回所有 SchemeNames)

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

请注意,在这两种情况下,生成的 SQL 都会引用您的联结表,即使它不是您的 EF 模型的一部分。

如果您已经拥有 Benefit 对象,当然,您可以更简单地使用以下方法获取其 SchemeNames:-

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

我会通过使用连接表来做到这一点。连接表是您的连接表。它将由两个外键组成,SchemeNameID 和 BenefitID。

查看此网站以获取有关连接表的更多信息:

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();

或在一个查询中

 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 回答