Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# BuildNotContainesPression在Windows 7-64位上对大数据集导致System.StackOverflowException_C#_Linq To Entities_Stack Overflow - Fatal编程技术网

C# BuildNotContainesPression在Windows 7-64位上对大数据集导致System.StackOverflowException

C# BuildNotContainesPression在Windows 7-64位上对大数据集导致System.StackOverflowException,c#,linq-to-entities,stack-overflow,C#,Linq To Entities,Stack Overflow,我遇到了一种情况,即我的应用程序在Windows 7 64位上与特定数据集崩溃。所有其他平台都可以在同一数据集上正常工作。我已经确定我的应用程序在BuildNotContainesPression中崩溃,许多人都发布了这一消息 有没有办法使用堆中的内存构建表达式? 我是否应该打破我的用户活动列表,一次处理更小的块(比如1000块)? 还有别的吗 List<int> usersActive = myContext.myTable.Select(a => a.tableUsersS

我遇到了一种情况,即我的应用程序在Windows 7 64位上与特定数据集崩溃。所有其他平台都可以在同一数据集上正常工作。我已经确定我的应用程序在BuildNotContainesPression中崩溃,许多人都发布了这一消息

有没有办法使用堆中的内存构建表达式?
我是否应该打破我的用户活动列表,一次处理更小的块(比如1000块)?
还有别的吗

List<int> usersActive = myContext.myTable.Select(a => a.tableUsersSnapshot.id).Distinct().ToList();
// The code blows up (only on Win7 64-bit) on this line when usersActive is large ~4000
// (probably will blow up on all platforms if usersActive is sufficiently large)
expTest = CustomExpressions.BuildNotContainsExpression<tableUsersSnapshot, int>(a => a.id, usersActive);
List<tableUsersSnapshot> usersToDelete = myContext.myTableSnapshot.Where(expTest).ToList();
// Delete the objects in the delete list
foreach(tableUsersSnapshot user in usersToDelete)
{
    myContext.DeleteObject(user);
}
List usersActive=myContext.myTable.Select(a=>a.tableUsersSnapshot.id).Distinct().ToList();
//当usersActive大到4000时,代码在这一行上爆炸(仅在Win7 64位上)
//(如果usersActive足够大,可能会在所有平台上爆炸)
expTest=CustomExpressions.BuildNotContainsExpression(a=>a.id,usersActive);
List usersToDelete=myContext.myTableSnapshot.Where(expTest.ToList();
//删除“删除”列表中的对象
foreach(usersToDelete中的tableUsersSnapshot用户)
{
myContext.DeleteObject(用户);
}
编辑:这是BuildNotContains函数-它不是递归函数:

public static Expression<Func<TElement, bool>> BuildNotContainsExpression<TElement, TValue>(Expression<Func<TElement, TValue>> valueSelector, IEnumerable<TValue> values)
    {  
        if (null == valueSelector) { throw new ArgumentNullException("valueSelector");}
        if (null == values) { throw new ArgumentNullException("values"); }

        ParameterExpression p = valueSelector.Parameters.Single();

        // p => valueSelector(p) != values[0] && valueSelector(p) != ...

        if (!values.Any())
        {
            return e => true;
        }

        var equals = values.Select(value => (Expression)Expression.NotEqual(valueSelector.Body, Expression.Constant(value, typeof(TValue))));
        var body = equals.Aggregate<Expression>((accumulate, equal) => Expression.And(accumulate, equal));
        return Expression.Lambda<Func<TElement, bool>>(body, p);
    }
公共静态表达式buildNotContainesPression(表达式值选择器,IEnumerable值)
{  
如果(null==valueSelector){抛出新的ArgumentNullException(“valueSelector”);}
如果(null==值){抛出新的ArgumentNullException(“值”);}
ParameterExpression p=valueSelector.Parameters.Single();
//p=>valueSelector(p)!=值[0]&&valueSelector(p)!=。。。
如果(!values.Any())
{
返回e=>true;
}
var=values.Select(value=>(Expression)Expression.NotEqual(valueSelector.Body,Expression.Constant(value,typeof(TValue)));
变量主体=等于.聚合((累计,等于)=>表达式和(累计,等于));
返回表达式.Lambda(body,p);
}
以下是我的EDMX图表的适用部分:
EF 4不需要
buildContainesPression
,您使用的是早期版本吗

看起来您正试图联接两个表以查找缺少的ID,但您是在客户端而不是在SQL server上进行的

相反,使用两个表之间的联接来查找没有相应用户的表快照。例如,见


如果两个表之间存在FK关系,则可以使用简单的!选择要删除的记录。任何(…)子句。

问题名称中StackOverflow的必需注释:)BuildNotContains是什么样子的?这听起来像是递归的,但我想不出它是这样的原因。还有,
where!someArray.Contains(a.Id)
在EF中不工作?我希望它能在LINQ到SQL中工作…包含在EF中对我不起作用,因此通过构建表达式来“跳过障碍”。我使用的是Visual Studio 2008,我相信它是EF 3.5。我来看看你的例子。我生来就是一名固件工程师,在学习数据库方面的知识。到目前为止,我已经把事情做好了,即使它们不是最有效的。你能详细说明一下你最后的陈述吗?我查询的第一个表(在原始问题中显示为myTable)确实包含usersSnapshot表的FK。如果您有关联,可以是类似于
myContext.myTableSnapshot.Where(ts=>!ts.myTable.Any())
的简单内容。发布您的EDMX图表会有所帮助。EF从V1变为V4。如果您不使用V4,我强烈建议您可以切换。我已经上传了EDMX图表。我想切换,但我觉得离发布时间太近了。现在这是一个太大的风险。