代码之家  ›  专栏  ›  技术社区  ›  llessurt

实体左联接以替换SQL

  •  0
  • llessurt  · 技术社区  · 8 年前

    我习惯于使用SQL左联接来获取所有可用选项的列表,并确定当前选择的项。我的桌子结构像这样

    Table MainRecord -- recordId | mainRecordInfo
    Table SelectedOptions -- recordId | optionId
    Table AvailableOptions -- optionId | optionValue
    

    我的问题是这样的

    SELECT optionValue, IIF(optionId IS NULL, 0, 1) AS selected
    FROM AvailableOptions AS a
    LEFT JOIN SelectedOptions AS s ON s.optionId = a.optionId AND a.recordId = 'TheCurrentRecord'
    

    我正试图用实体框架替换它,所以我需要模型和查询的帮助——它们都需要更正。

    public class MainRecord
    {
        public int recordId { get; set; }
        public string mainRecordInfo { get; set; }
        [ForeignKey("recordId")]
        public List<SelectedOptions> selectedOptions { get; set; }
    }
    public class SelectedOptions
    {
        public int recordId { get; set; }
        public int optionId { get; set; }
    }
    public class AvailableOptions
    {
        public int optionId { get; set; }
        public string optionValue { get; set; }
    }
    

    查询

    IQueryable<AvailableOptions> options = from o in context.AvailableOptions select o;
    

    我可以得到一个可用选项的列表,但是我如何才能得到一个列表并知道选择了哪些选项?

    2 回复  |  直到 8 年前
        1
  •  1
  •   JuanR    8 年前

    如果选择和可用选项的数量足够小,则可以在内存中执行此操作:

    var selected = options.Join(record.selectedOptions, ao => ao.optionId, so => so.optionId, (a, s) => new { Available = a, Selected = s });            
    

    selected 现在将是具有 Available Selected 作为属性,并且只包含与 optionId 价值。

    如果你只想得到 AvailableOptions 那场比赛,简单地用链子A Select 加入:

    var selected = options.Join(record.selectedOptions, ao => ao.optionId, so => so.optionId, (a, s) => new { Available = a, Selected = s })
    .Select(o => o.Available);
    
        2
  •  0
  •   Thomas Koelle    8 年前

    不是一个完整的答案,但是理解从模型中获得的导航属性是非常好的。这里有一个查询,很可能不是您想要的,但它可以证明这一点。

    from ao in _db.AvailableOptions
    where ao.recordId == "TheCurrentRecord" && ao.SelectedOptions.OptionId == 1
    select new
    MyPoxo {ao.SelectedOptions.Value ?? 0};
    

    因此,您不需要仅仅通过fks指定的连接来导航。在这个例子中,我假设AvailableOptions有一个到SelectedOptions的链接。

    推荐文章