【问题标题】:Linq query EntityCommandExeceptionException errorLinq查询EntityCommandExceptionException错误
【发布时间】:2014-04-24 09:01:45
【问题描述】:

当我从以下查询中调用“api/test/name=stop,tap,app...(24 个名称值)”时,我遇到了错误:

"Message":"An error has occurred.","ExceptionMessage":"Some part of your SQL statement is nested too deeply. Rewrite the query or break it up into smaller queries.","ExceptionType":"System.Data.SqlClient.SqlException

Linq 查询:

        var data = db.database_bd.AsQueryable();

            if (query.startDate != null)
            {
                data = data.Where(c => c.UploadDate >= query.startDate);
            }

            // If any other filters are specified, return records which match any of them:
            var filteredData = new List<IQueryable<database_bd>>();

            if (!string.IsNullOrEmpty(query.name))
            {
                var ids = query.name.Split(',');
                foreach (string i in ids)
                {
                    filteredData.Add(data.Where(c => c.Name != null && c.Name.Contains(i)));
                }
            }
            // If no filters passed, return all data.
            // Otherwise, combine the individual filters using the Union method
            // to return all records which match at least one filter.
            if (filteredData.Count != 0)
            {
                data = filteredData.Aggregate(Queryable.Union);
            }
            if (!data.Any()) //line causing error
            {
                var message = string.Format("No data was found");
                return Request.CreateErrorResponse(HttpStatusCode.NotFound, message);
            }

            return Request.CreateResponse(HttpStatusCode.OK, data);
        }      

查询类:

public class Query
 {
    public string name { get; set; }
    public Nullable<DateTime> startDate { get; set; }
    public Nullable<DateTime> endDate { get; set; }
 }

我尝试在“filterdata”方法中添加一个范围,但我无法让它工作。任何建议,将不胜感激。

谢谢

【问题讨论】:

  • 所以您希望数据与 firstFilter (startDate) 或数据与其他过滤器 (query.name) 相结合?
  • 我希望能够使用 (name) 参数调用 (startDate),但如果可能的话,能够过滤许多 (name) 参数值 (1-70)。所以回答 - 与其他过滤器(query.name)相结合的数据。感谢您的回复。

标签: c# linq entity-framework asp.net-web-api


【解决方案1】:

这不起作用?

var data = db.database_bd.AsQueryable();

if (query.startDate != null)
{
    data = data.Where(c => c.UploadDate >= query.startDate);
}

if (!string.IsNullOrEmpty(query.name))
{
    var list = query.name.Split(',');
    data = data.Where(pr => list.Any(pr2 => pr.Name.Contains(pr2)));
}

【讨论】:

  • 感谢您的回复。很抱歉,上面的代码给了我以下错误,“API_09Oct.database_bd”不包含“list”的定义,并且没有扩展方法“list”接受“API_09Oct.database_bd”类型的第一个参数(您是否缺少 using 指令或程序集引用?)。我之前尝试过添加(列表),但它也给了我类似的错误。
  • 哦,抱歉,我认为我在最后一行代码中有错字,显然您需要访问列表而不是 pr.list。
  • 抱歉,我最初确实尝试删除 (pr.),但它给了我另一个错误 - Delegate 'System.Func。非常感谢您的时间和帮助。
  • 这很奇怪,我只是在本地测试了它,它工作得很好。你的域模型有什么奇怪的地方吗?
  • 是的,小写的s,显然你应该能够解释编译器错误。
【解决方案2】:

我会为此使用predicatebuilder(查看“安装”文档)。

var data = db.database_bd.AsQueryable();

var mainPredicate = PredicateBuilder.True<database_bd>();


if (query.startDate != null)
    mainPredicate = mainPredicate.And(c => c.UploadDate >= query.startDate);

if (!string.IsNullOrEmpty(query.name))
{
    var namePredicate = PredicateBuilder.False<database_bd>();
    var ids = query.name.Split(',');
    foreach (var id in ids) {
       namePredicate = namePredicate.Or(c => c.Name != null && c.Name.Contains(id));
    }
    mainPredicate = mainPredicate.And(namePredicate);
}
data = data.Where(mainPredicate );

if (!data.Any()) //line hopefully causing no more error
{
     var message = string.Format("No data was found");
     return Request.CreateErrorResponse(HttpStatusCode.NotFound, message);
}

【讨论】:

  • 非常感谢您的帮助和时间。很抱歉,上面的查询真的很慢,它没有从搜索条件中输出结果,而是转储了整个数据集记录。如果可能,请提供建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多