【发布时间】:2015-07-08 18:44:12
【问题描述】:
是否可以在 Entity Framework 6 中实现条件连接子句?具体来说,INNER JOIN ON (boolean condition1) OR (boolean condition2)。
下面的代码有效,但调用了数据库两次。是否可以将其合并为一个电话?
有一个外键关系将 FirmFeatures.FeatureId 与 Nullable FirmParameters.FeatureId 联系起来
var dbContext = new MyEntities();
var feature = dbContext.FirmFeatures
.Where(f => f.FeatureId == featureId)
.First();
var parameters = dbContext.FirmParameters.AsQueryable();
parameters = feature.IsDbTable
? parameters.Where(p => p.FeatureId == null)
: parameters.Where(p => p.FeatureId == featureId);
var list = parameters.ToList()
SQL 调用类似于:
SELECT feature.*, parameter.*
FROM [FirmFeature] AS feature
INNER JOIN [FirmParameter] AS parameter
ON (feature.IsDbTable = 0 AND feature.FeatureId = parameter.FeatureId) OR (feature.IsDbTable = 1 AND parameter.FeatureId IS NULL)
WHERE feature.[FeatureId] = 3
这首先利用了数据库模型。
我是实体框架的新手。
Edit2:因此,我希望同时从数据库中加载功能对象和参数对象。
编辑:根据要求,以下是模型:
{
public FirmFeature()
{ this.FirmParameters = new HashSet<FirmParameter>(); }
public byte FeatureId { get; set; }
public bool IsDbTable { get; set; }
...
public virtual ICollection<FirmParameter> FirmParameters { get; set; }
}
public partial class FirmParameter
{
public byte ParameterId { get; set; }
public Nullable<byte> FeatureId { get; set; }
...
public virtual FirmFeature FirmFeature { get; set; }
public virtual FirmParameter FirmParameter1 { get; set; }
public virtual FirmParameter FirmParameter2 { get; set; }
}
【问题讨论】:
-
你能分享你的 c# db 架构吗?
-
您需要展示您的实体。此外,没有理由在
dbContext.FirmParameters之后添加AsQueryable(),因为它已经是IQueryable。 -
没有它,编译失败。无法将类型“System.Linq.IQueryable
”隐式转换为“System.Data.Entity.DbSet ”。存在显式转换(您是否缺少演员表?)@haim770 -
那是因为稍后您将返回的
Queryable.Where类型分配给同一个parameters变量。虽然AsQueryable()解决了这个问题,但它的目的是为了别的。更易读的方法是IQueryable<FirmParameter> parameters = dbContext.FirmParameters; -
@Hoppe,实际上我错了,假设这不是
AsQueryable()的合法使用,事实上,它完全没问题。
标签: c# sql-server linq entity-framework entity-framework-6