EF左边连接两个属性的表和case语句

Gra*_*ush 4 linq-to-entities entity-framework left-join case-statement entity-framework-4

我正在尝试为数据库编写一个查询,该数据库将表连接到查找表,结果将根据case语句返回.

在普通的SQL中,查询看起来像这样:

SELECT chis_id, chis_detail, cilt.mhcatID, cilt.mhtID, 'TheFileName' =
CASE  
    WHEN cilt.mhcatID IS NOT NULL AND cilt.mhtID IS NOT NULL THEN chis_linked_filename
    END
FROM chis
    LEFT JOIN cilt on cilt.mhcatID = chis.mhcat_id AND cilt.mhtID = chis.mht_id 
WHERE cch_id = 50
Run Code Online (Sandbox Code Playgroud)

chis是被查询的表,cilt是一个查找表,并且不包含任何与chis的外键关系(chis分别由mhtID和mhcatID存在于mht和mhcat表中的FK).

该查询将用于返回记录的历史更新列表.如果与cilt查找表的连接成功,则意味着查询的调用者将有权查看历史更新的任何关联文件的文件名.

虽然在我的研究过程中我发现了各种关于如何在Linq中实现案例陈述和左联接到实体查询的帖子,但我还是没有能够找到如何加入两个不同的领域.这可能吗?

Adu*_*cci 6

您需要使用匹配的字段名称加入匿名类型,如下所示:

var query = from x in context.Table1
            join y in context.Table2
            on new { x.Field1, x.Field2 } equals new { y.Field1, y.Field2 }
            select {...};
Run Code Online (Sandbox Code Playgroud)

使用extra from而不是a的完整工作示例join看起来像这样:

var query = from chis in context.Chis
            from clit in context.Clit
                                .Where(x => x.mhcatID = chis.mhcat_id)
                                .Where(x =>  x.mhtID = chis.mht_id)
                                .DefaultIfEmpty()
            select new
            {
              chis.id, 
              chis.detail, 
              cilt.mhcatID, 
              cilt.mhtID,
              TheFileName = (cilt.mhcatID != null && cilt.mhtID != null) ? chis.linked_filename : null
            };
Run Code Online (Sandbox Code Playgroud)