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

时间:2012-01-10 13:50:39

标签: entity-framework entity-framework-4 linq-to-entities left-join case-statement

我正在尝试为数据库编写查询,该数据库将表连接到查找表,结果将根据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

chis是要查询的表,cilt是一个查找表,因此不包含与chis的任何外键关系(chis现有FK到mht和mhcat表由分别是mhtID和mhcatID。

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

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

2 个答案:

答案 0 :(得分: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 {...};

使用额外from代替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
            };

答案 1 :(得分:1)

根据Aducci的建议,我使用了一个group join和DefaultIsEmpty()来获得我想要的结果。出于某种原因,我无法让DefaultIfEmpty()无法正常工作,结果SQL使用内连接而不是左连接。

这是我用来使左连接工作的最终代码:

var query = (from chis in context.chis
             join cilt in context.cilts on new { MHT = chis.mht_id, MHTCAT = chis.mhcat_id } equals new { MHT = cilt.mhtID, MHTCAT = cilt.mhcatID } into tempCilts
             from tempCilt in tempCilts.DefaultIfEmpty()
             where chis.cch_id == 50
             select new { 
                             chisID = chis.chis_id, 
                             detail = chis.chis_detail, 
                             filename = chis.chis_linked_filename, 
                             TheFileName = (tempCilt.mhcatID != null && tempCilt.mhtID != null ? chis.chis_linked_filename : null), 
                               mhtID = chis.mht_id, 
                               mhtcatID = chis.mhcat_id 
                        }).ToList();