实体左侧加入以替换 SQL

Entity Left Join to Replace SQL

我习惯于使用 SQL 左连接来获取所有可用选项的列表并确定当前选择的项目。我的 table 结构看起来像这样

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'

我正在尝试将其替换为 Entity Framework,因此我需要模型和查询方面的帮助——它们都需要更正。

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;

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

如果选择和可用选项的数量足够少,你可以在内存中这样做:

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

selected 现在将是具有 AvailableSelected 作为属性的对象列表,并且将仅包含在 optionId 值中匹配的对象。

如果您只想获得匹配的 AvailableOptions 的纯列表,只需将 Select 链接到连接:

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

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

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

因此,您不仅可以浏览由 FK 指定的联接,还可以。在这个例子中,我假设 AvailableOptions 会有一个指向 SelectedOptions 的链接。