实体左侧加入以替换 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
现在将是具有 Available
和 Selected
作为属性的对象列表,并且将仅包含在 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 的链接。
我习惯于使用 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
现在将是具有 Available
和 Selected
作为属性的对象列表,并且将仅包含在 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 的链接。