【问题标题】:C# ASP.NET MVC 5 How to execute a raw query?C# ASP.NET MVC 5 如何执行原始查询?
【发布时间】:2016-06-08 20:28:54
【问题描述】:

我正在尝试使用 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、integers。我怎样才能让这个查询工作?

更新 将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 "{}";

        }

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

【问题讨论】:

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


    【解决方案1】:

    不确定您使用的是什么 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 条记录,但 JsonConvert 将其转换为空对象,即 [] 我不确定这是否与此问题相关,但你知道为什么它会返回和空对象吗?我将用我当前的代码更新我的问题
    • @MikeA 查看firstAccount的内容,是不是空的?
    • 我真的不知道该怎么说。我不是 C# 和 VS。但是当我设置一个断点并将脚本运行到调试模式时,帐户计数为 1,那么第一个 AccountCount 为 0。我将使用屏幕截图更新我的问题,以向您展示我所看到的
    • 在if (firstAccount != null) 上设置断点,然后将鼠标悬停在firstAccount 上。变量的值会显示出来
    【解决方案2】:

    您要求IEnumerable&lt;string&gt; 这是一个接口。您需要选择一个实现IEnumerable 的类,例如List

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 2012-11-09
      相关资源
      最近更新 更多