将数组连接到EF查询

Ed *_*nek 4 c# linq sql-server linq-to-entities entity-framework

尝试将数组连接到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.
        });
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ale*_*Aza 5

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

if (vids.Count > 0)
{
    qry = qry.Where(arg => vids.Contains(arg.VId));
}
Run Code Online (Sandbox Code Playgroud)

仅当vids少于2100个元素时才会起作用,因为这将转换为IN (x, y, .., n)条件.

如果您使用实体框架3.5,那么Contains将无法正常工作.你可以在这里找到可能的解决方案:使用Linq to Entities的'Contains()'解决方法?