将数组连接到EF查询

时间:2011-06-18 18:26:57

标签: c# sql-server linq entity-framework linq-to-entities

尝试将数组连接到Linq-to-EF查询时出现以下错误

  

执行命令定义时发生错误。有关详细信息,请参阅内部异常SQL语句的某些部分嵌套得太深。重写查询或将其分解为较小的查询。

代码如下:

var vids = new List<string>();
using (var ctx = new MyDbContext())
{
    var qry = ctx.Pickups.Where(p => p.UserName == User.Identity.Name);
    if (someBoolean)
    {
        var v = GetVids(); // get the list of Ids from a web service
        vids.AddRange(v);
    }
    if (vids.Count() > 0)
    {
        qry = qry.Join(vids, p => p.VId, v => v, (v, p) => p);
    }
    var data = qry
        .Select(p => new
        {
            // etc.
        });
}

问题是Web服务与我使用EF的数据库没有关联,否则,我只是对数据库中的表进行连接。我从网络服务中回来的Id的数量可能超过一百(通常是5-10)。如果我注释掉Join,代码工作正常,所以我知道错误在Join中。只有少数(最多约30个)视频中的ID,连接效果非常好。

您建议如何解决此问题?我唯一能想到的是将ID列表插入数据库并以这种方式进行连接。这对我来说似乎不太吸引人。

1 个答案:

答案 0 :(得分:5)

尝试将if (vids.Count() > 0)替换为:

if (vids.Count > 0)
{
    qry = qry.Where(arg => vids.Contains(arg.VId));
}

仅当vids小于2100个元素时才会有效,因为这会转换为IN (x, y, .., n)条件。

如果您使用实体框架3.5,那么Contains将无效。您可以在此处找到可能的解决方案:'Contains()' workaround using Linq to Entities?