如何执行查询以选择多个属性,这些属性受两个表中多个where子句的约束

时间:2014-03-03 16:06:24

标签: c# linq lambda

我有两个表,我想从中选择数据:

Document_Data
Document_info

我想执行以下查询:

SELECT DISTINCT Document_Data.DOC_CLASS, TITLE FROM Document_info,Document_Data WHERE (((DOC_STATUS = '1') AND (PORTAL = 'First Page'))) AND (Document_info.DOC_NUMBER = Document_Data.DOC_NUMBER AND Document_info.REVISION = Document_Data.REVISION AND STATUS = 'CURRENT' AND Document_Data.DOC_CLASS = 'MESSAGE')

任何人都可以向我提供有关如何使用Linq执行以下查询的信息吗?

1 个答案:

答案 0 :(得分:1)

我做了一些假设,因为你的查询确实没有留下几个表名。我假设STATUS在Document_data表上,而DOC_STATUS在Document_info表上。如果它有任何不同,那么修改这个查询就不难了。

DbContext是您的实体框架上下文或存储数据库集合的任何位置。

dbContext.Document_info.Where(i => i.DOC_STATUS == "1" && i.PORTAL == "First Page")
    .Join(dbContext.Document_data.Where(d => d.DOC_CLASS == "MESSAGE" && d.STATUS == "CURRENT"),
        i => new { i.REVISION, i.DOC_NUMBER }, //Document_info
        d => new { d.REVISION, d.DOC_NUMBER }, //Document_data
        (i, d) => new { d.DOC_CLASS, i.TITLE }) //(Document_info, Document_data)
    .Distinct()
    .ToList();

这样做的方法是首先将document_info表过滤到你想要的那个。然后,它将其与由REVISIONDOC_NUMBER组成的复合“密钥”上的已过滤的Document_data表连接起来。之后,它运行Distinct并使用ToList执行整个查询。

上面应该编译成有效的SQL(至少它会使用MySQL连接器......我没有尝试过类似MSSQL的东西,但我认为既然MSSQL比MySQL更好用,所以它会有意义它也会在那里工作)。但是,这个特定的查询会有点复杂,除非您在REVISIONDOC_NUMBER上定义了一些外键,否则可能无法达到最佳效果。

我会注意到,您的查询只返回d.DOC_CLASS == "MESSAGE"的内容,因此您的结果会非常重复。