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.InternalQuery
1.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(这是一种匿名类型)作为引用类型.这种行为是否记录在某处?
好吧,您对连接实体进行了空检查,这在 sql 方面没有意义。以下内容应正确解释为合并:
Data = m.Data ?? [default value]
Run Code Online (Sandbox Code Playgroud)