0

我有的:

  • 带有数据的数据库并通过以下方式连接到它

    public class VMMExtDBContext : DbContext {...}
    
  • 在这里面完美地工作是这样的:

    public DbSet<VirtualMachine> VirtualMachines { get; set; }
    
  • 现在我需要一个从 MSSMS 完美运行的运行查询:

    select SUM(CPUCount), SUM(RAMSizeGB), SUM(PrimaryHDDVolumeGB) 
    from TempVMs 
    where VMCloudID='f51b73b5-fdb3-4af2-956b-b27fccc5e19d'
    

所以我写了代码:

public QuotaPresenter(VMMExtDBContext db, Guid CloudID)
{
        string entitySQL = "select SUM(CPUCount), SUM(RAMSizeGB), SUM(PrimaryHDDVolumeGB) from TempVMs where VMCloudID='"+CloudID.ToString()+"'";
        //or = "select SUM(CPUCount), SUM(RAMSizeGB), SUM(PrimaryHDDVolumeGB) from dbo.TempVMs where VMCloudID='"+CloudID.ToString()+"'";


        var objectContext = (db as IObjectContextAdapter).ObjectContext;

        var query=objectContext.CreateQuery<UsedQuotaValue>(entitySQL);

        query.MergeOption = System.Data.Objects.MergeOption.NoTracking;
        var QuoteValues=query.ToList(); //<--Exception here
        if (QuoteValues.Count > 0) {
            //На случай если нет ни одной виртуальной машины - оставляем по нулям
            UQV.CPU = QuoteValues[0].CPU;
            UQV.RAM = QuoteValues[0].RAM;
            UQV.PrimaryHDDGB = QuoteValues[0].PrimaryHDDGB;
        }
}

当我运行时出现异常:

[System.Data.EntitySqlException] 'TempVMs' 无法在当前范围或上下文中解析。确保所有引用的变量都在范围内,加载了所需的模式,并且正确地引用了命名空间。接近简单标识符,第 1 行,第 68 列。

我错过了什么?

4

2 回答 2

0

我认为问题在于您正在尝试使用常规 transact-sql 代替实体 sql,它们实际上并不相同。看看Aggregate Functions,这可能会对你有所帮助(我自己无法测试)

SELECT VALUE SqlServer.SUM(p.ListPrice) 
FROM AdventureWorksEntities.Products as p
于 2012-08-16T11:59:56.027 回答
0

我认为问题是您缺少表名中的模式标识符。如果我是正确的,如果没有 group by 语句,查询将无法工作。

于 2012-08-16T10:46:52.367 回答