使用db.Database.SqlQuery处理错误

时间:2015-01-22 16:18:06

标签: entity-framework c#-4.0

今天我遇到了一个问题,我的查询失败了。我正在使用db.Database.SqlQuery<T>()来查询其他应用程序数据。我们对其数据有自定义视图。今天,管理员重建了软件中的索引,并在此过程中删除了自定义视图。虽然这是SO无法解决的问题,但您可以帮助的问题是优雅地处理视图不再存在的情况。

对于主应用程序,我们将此数据用作补充数据。这意味着如果无法访问服务器或表,则显示信息并不重要。该查询在以下WebApi操作中运行(我在调试时根据我的观察添加了一些注释。):

    public Task<HttpResponseMessage> GetByAddress(string id)
    {
        Task<HttpResponseMessage> response;

        string sql = // my sql statement;
        List<object> parameterList = new List<object>();
        parameterList.Add(id.ToUpper());
        object[] param = parameterList.ToArray();

        // This is worthless since the following line will completely replace this
        IEnumerable<CallsForService> calls = new List<CallsForService>(); 
        // If the table does not exist, this does not throw an error, instead it creates a different object with the error details.
        calls = db.Database.SqlQuery<CallsForService>(sql, param);

        response = Task.FromResult<HttpResponseMessage>(Request.CreateResponse(HttpStatusCode.OK, calls));
        return response;
    }

我的问题是如何检查这些错误,并至少优雅地向调用应用程序发送一个空列表。然后我可以用ELMAH记录这些错误,这样我就能解决问题并修复它。

1 个答案:

答案 0 :(得分:0)

在枚举结果之前不会执行查询,因此您只需计算返回的记录数,如果有则会引发错误。

calls = db.Database.SqlQuery<CallsForService>(sql, param);
var recCount = calls.Count();

在最后一行之后引发的任何错误都将被try / catch块捕获。