Получил словарь с идентификатором личности в качестве ключа. И каждое значение представляет собой List с классом, который содержит дату и время.Linq to SQL replace .Any() with .Contains()
Я хочу получить все контракты из базы данных, где каждая дата в списке находится между контрактами от и до -date. Для каждого человека может быть несколько.
Невозможно использовать. Любой() функция. Если я это сделаю, я получу эту ошибку: «Локальная последовательность не может использоваться в LINQ to SQL-реализации операторов запросов, кроме оператора Contains()».
Это пример с помощью метода .Any, который не работает с linq в sql. И мне нужен другой способ справиться с этим.
public class SimpleObject
{
public bool Test { get; set; }
public DateTime DateTime { get; set; }
}
private void Test(Dictionary<int, List<SimpleObject>> dataBaseObjDictionary)
{
using (var db = TpContext.Create())
{
var selectedObj = db.Contracts.Where(x => dataBaseObjDictionary.ContainsKey(x.PersonRef) && dataBaseObjDictionary.Values.Any(y => y.Any(a => x.FromDate <= a.DateTime) && y.Any(a=>a.DateTime >= x.UntilDate)));
}
}
Я думаю, что LINQ к SQL не знаю, как перевести метод ContainsKey к SQL, попробуйте переписать dataBaseObjDictionary.ContainsKey (x.PersonRef) в dataBaseObjDictionary.Keys.Contains (x.PersonRef). – Oleg
Я бы даже сделал еще один шаг и постараюсь сделать запрос LINQ максимально простым, так что есть меньше, что может пойти не так: 'int [] keys = dataBaseObjDictionary.Keys.ToArray(); ... .Where (x => keys.Contains (x.PersonRef) ... '. Я не знаю, изменит ли это, но я знаю с Entity Framework, я видел, как он жалуется на время выполнения Аналогичные вещи, поэтому вам нужно просто поддерживать LINQ. –
Сделал редактирование на мой вопрос. Дело в том, что я не могу использовать метод .Any(). Он вызывает у меня ошибку. – thatsIT