2015-06-09 55 views
0

我有这个疑问在SQL Server:实体框架和联合声明

SELECT 'QueueA', COUNT(*) FROM QueueA_Table 
UNION 
SELECT 'QueueB', COUNT(*) FROM QueueB_Table 

我该怎么做实体框架的相同呢?我能做的最好的是:

using (var db = new dbContext()) 
{ 
    return new QueueCount[] { 
     new QueueCount("QueueA", db.QueueA_Table.Count()), 
     new QueueCount("QueueB", db.QueueB_Table.Count()) 
    }; 
} 

但是,根据LINQPad,这会导致两个单独的查询到数据库。

SELECT COUNT(*) AS [value] 
FROM [QueueA_Table] AS [t0] 
GO 
SELECT COUNT(*) AS [value] 
FROM [QueueB_Table] AS [t0] 

有没有办法写它,只有一个查询被发送到数据库?

+0

您可以试试将来的查询。 https://github.com/loresoft/EntityFramework.Extended –

回答

1

也许不是最漂亮或最易维护的方式做到这一点:

db.Database.SqlQuery<int>(@" 
    SELECT COUNT(*) FROM QueueA_Table 
    UNION 
    SELECT COUNT(*) FROM QueueB_Table"); 

,或者如果你想填充类:

public class QueueCount 
{ 
    public string Name { get; set; } 
    public int Count { get; set; } 
} 
db.Database.SqlQuery<QueueCount>(@" 
    SELECT [Name] = 'QueueA', [Count] = COUNT(*) FROM QueueA_Table 
    UNION 
    SELECT [Name] = 'QueueB', [Count] = COUNT(*) FROM QueueB_Table");  
+0

问题在于代码不给我队列名称。如果我尝试像这样:'return db.Database.SqlQuery (sql).ToList();' QueueCount在其构造函数中具有参数,并且它只返回2个默认值的记录。我讨厌实现上面的代码,然后必须迭代尝试将队列匹配到行号。 – BillN

+0

@BillN:哦如果你有一个默认的构造函数和属性,你可以通过'SqlQuery'来填充一个类。查看编辑。 – jjj

+0

正如你所说的“不是最漂亮的”,而是比拨打x而不是一个电话更好。谢谢@jjj – BillN

0

查询是丑,它几乎是一个黑客:

(from s in QueueA_Table.Take(1) 
select new List<int> { 
    QueueA_Table.Count(), 
    QueueB_Table.Count() 
}).First() 

(from s in QueueA_Table.Take(1) 
select new { 
    QueueA = QueueA_Table.Count(), 
    QueueB = QueueB_Table.Count() 
})