在Linq中使用通用操作时,NotSupportedException



在工作中,我必须制作一个可以在SharePoint上联系WCF服务的控制台应用程序,从列表中删除一些数据,并将其与我们的Microsoft SQL Server数据库中的一些数据进行比较。<<<<<<<<<<<<<<<<<<<<

现在,我几乎把它弄清楚了,但是当试图提取一些我需要的值时,我遇到了一些问题。我需要将两个不同的值放在相同的对象表示中。为此,我必须进行两次相同的查询,但在两个不同的Title字段标准:

context.Values.Where(i => i.Title.Equals("Flight number:") && surveyIds.Contains(i.Survey.Id) == true).ToList();
context.Values.Where(i => i.Title.Equals("Date") && surveyIds.Contains(i.Survey.Id) == true).ToList();

问题在于,我不能在不获取NotSupportedException

的情况下称呼该代码的这一部分
surveyIds.Contains(i.Survey.Id)

表达式(([[10007] .title =="飞行号:")和(value(system.collections.generic.list.1 [system.int32])。包含([10007] .survey.id)== true))不支持。

在代码中进一步添加了另一个名为surveyIds的列表,该列表中充满了整数,并限制了我所做的列表搜索,我想将附加的调查与值的ID进行比较(因为它是一个查找)我的surveyIds列表中的那些。

List<FlightSurveysDataContext.SurveysItem> reports = context.Surveys.Where(i => i.Title.Equals("Quality report - Cleaning") && i.UploadComplete == true).ToList();
List<int> surveyIds = new List<int>();
foreach (SurveysItem item in reports) { surveyIds.Add(item.Id); }

我可以以其他方式这样做吗?我想一次这样做的原因是,如果我不限制搜索,该集合只会获得与标题匹配的第一个1,000个值,而SharePoint列表当前有超过200,000个项目,所以我敢肯定要获取我不想要的物品。

正如我在评论中提到的,看起来SharePoint Linq查询提供商不支持常数Contains表达式。

您可以尝试使用等效的||条件构建使用以下助手:

public static partial class QueryableExtensions
{
    public static IQueryable<T> WhereIn<T, V>(this IQueryable<T> source, Expression<Func<T, V>> valueSelector, IEnumerable<V> values)
    {
        var condition = values
            .Select(value => Expression.Equal(valueSelector.Body, Expression.Constant(value)))
            .DefaultIfEmpty()
            .Aggregate(Expression.OrElse);
        if (condition == null) return source;
        var predicate = Expression.Lambda<Func<T, bool>>(condition, valueSelector.Parameters);
        return source.Where(predicate);
    }
}

用法将是:

var result = context.Values
    .Where(i => i.Title.Equals("Flight number:"))
    .WhereIn(i => i.Survey.Id, surveyIds)
    .ToList();

相关内容

  • 没有找到相关文章