NotSupportedException при использовании универсальной операции в LINQ
На работе мне нужно создать консольное приложение, которое может связываться со службой WCF на Sharepoint, извлекать некоторые данные из списка и сравнивать их с некоторыми данными из нашей базы данных 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 == "Номер рейса:") И (значение (System.Collections.Generic.List`1[System.Int32]). Содержит ([10007].Survey.Id) == True)) не поддерживается.
Далее в коде я сделал еще один список под названием surveyIds
который полон целых чисел и чтобы ограничить поиск по списку, который я делаю, я хотел сравнить опрос, прикрепленный к идентификатору значения (так как это поиск) с теми, что в моем 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); }
Могу ли я сделать это другим способом? Причина, по которой я хочу сделать это за один раз, заключается в том, что если я не ограничу поиск, коллекция получит только первые 1000 найденных значений, соответствующих названию, а список Sharepoint содержит чуть более 200 000 элементов, поэтому я уверен, что чтобы получить предметы, которые я не хочу.
1 ответ
Как я уже упоминал в комментариях, похоже, что поставщик запросов 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();