如何在Entity Framework中组合内连接和左连接

Vin*_*ayC 7 .net c# linq-to-entities entity-framework entity-framework-4

我使用的DBContext是EF 4.1的API.考虑以下实体模型(A,B,E,D是实体)

答:aId

B:aId,cId

E:eId,aId

D:eId,cId,Data

我想要的是相当于下面的SQL查询

SELECT
   B.aId,
   B.cId,
   COALESCE(M.Data, [default value])
FROM
   B LEFT OUTER JOIN
   (
      SELECT
         E.aId,
         D.cId,
         D.Data  
      FROM
         E INNER JOIN D ON E.eId = D.eId
   ) M
   ON B.aId = M.aId AND B.cId = M.cId
Run Code Online (Sandbox Code Playgroud)

它很容易在B,E&D上加入,但我发现我无法解决上面的查询.我已经尝试了linq形式的我认为是一个等效的查询

// inner join equivalent
var ee = db.E.Join(db.D, e => e.eId, d => d.eId,
    (e, d) => new { e.aId, e.eId, d.cId, d.Data });

// left outer join
var o = from c in db.B
        join e in ee on new { c.aId, c.cId }
            equals new { e.aId, e.cId } into temp
        from m in temp.DefaultIfEmpty()
        select new
        {
            c.aId,
            c.cId,
            Data = null != m ? m.Data : [default value]
        };
Run Code Online (Sandbox Code Playgroud)

但是,当我o.ToString()使用以下异常详细信息调用时,这会失败:

System.ArgumentException:DbIsNullExpression的参数必须引用基元或引用类型.在System.Data.Common.CommandTrees.ExpressionBuilder.Internal.ArgumentValidation.ValidateIsNull(DbExpression参数,布尔allowRowType)在System.Data.Objects.ELinq.ExpressionConverter.EqualsTranslator.CreateIsNullExpression(ExpressionConverter母体,表达式输入)在System.Data.Objects .ELinq.ExpressionConverter.EqualsTranslator.TypedTranslate(ExpressionConverter父,BinaryExpression LINQ)在System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter父,表达LINQ)

... [更多堆栈跟踪在这里]

在System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(表达式LINQ)在System.Data.Objects.ELinq.ExpressionConverter.Convert()
在System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(可空1 forMergeOption) at System.Data.Objects.ObjectQuery.ToTraceString() at System.Data.Entity.Internal.Linq.InternalQuery1.ToString()在System.Data.Entity.Infrastructure.DbQuery`1.ToString()

我试图使用扩展方法形成类似的查询,但有相同的异常.我在这里错过了什么?

-------------------------------------------------- -------------------------------

编辑:

似乎问题是由于线路问题

Data = null != m ? m.Data : [default value]
Run Code Online (Sandbox Code Playgroud)

我已将其修改为

   Data = m
Run Code Online (Sandbox Code Playgroud)

它开始工作了.我必须在我使用结果的地方移动空检查逻辑.现在,我想知道什么是异常的原因?从异常细节来看,它似乎无法找出m(这是一种匿名类型)作为引用类型.这种行为是否记录在某处?

Tra*_*x72 3

好吧,您对连接实体进行了空检查,这在 sql 方面没有意义。以下内容应正确解释为合并:

Data = m.Data ?? [default value]
Run Code Online (Sandbox Code Playgroud)