C#ASP.NET MVC 5如何执行原始查询?

时间:2016-02-25 20:43:15

标签: c# asp.net asp.net-mvc entity

我正在尝试使用c#执行原始查询。

这就是我所做的

var accounts = conn.Database.SqlQuery<IEnumerable<string>>("SELECT TOP 1 a.* FROM zipcodes_to_accounts AS c " +
"INNER JOIN accounts AS a ON a.id = c.account_id " +
"WHERE c.zip_code = @p0 "+
"ORDER BY a.completed_ll + a.completed_cp ASC", zipcode).ToArray();

然后我想获取第一条记录并将其转换为json对象。

if (accounts.Count() > 0)
{
    return JsonConvert.SerializeObject( accounts.First() ); 
}

但查询给我一个错误

  

结果类型'System.Collections.Generic.IEnumerable`1 [System.String]'可能不是抽象的,必须包含默认构造函数。

accounts表有一些列是varchar,datetime,整数。如何才能使此查询生效?

已更新IEnumerable转换为列表,就像它在答案中所建议的那样。但现在JsonConvert正在返回一个空对象。这是我目前的代码

       //getAccount
        public string GetAccount()
        {


            string zipcode = StringHelpers.StringOrNull(Request["zip_code"]);

            if (zipcode != null)
            {

                var accounts = conn.Database.SqlQuery<List<string>>("SELECT TOP 1 a.* FROM zipcodes_to_accounts AS c " +
"INNER JOIN accounts AS a ON a.id = c.account_id "+
"WHERE c.zip_code = @p0 "+
"ORDER BY a.completed_ll + a.completed_cp ASC", zipcode).ToList();
                var firstAccount = accounts.FirstOrDefault();

                if (firstAccount != null)
                {
                    return JsonConvert.SerializeObject(firstAccount);
                }

            }

            return "{}";

        }

当我调试我的代码这是我看到的

enter image description here

2 个答案:

答案 0 :(得分:4)

不确定您正在使用的ORM,但警告告诉您IEnumerable无法构建,因为它是一个接口。因此,SqlQuery方法无法知道您期望的返回类型。

尝试用具体类型替换泛型约束:

var accounts = conn.Database.SqlQuery<string>("SELECT TOP 1 a.* FROM zipcodes_to_accounts AS c " +
"INNER JOIN accounts AS a ON a.id = c.account_id " +
"WHERE c.zip_code = @p0 "+
"ORDER BY a.completed_ll + a.completed_cp ASC", zipcode).ToArray();

答案 1 :(得分:2)

您要求IEnumerable<string>这是一个界面。您需要选择一个实现IEnumerable的类,例如List