Содержание EF FAQ
Вы можете встретить следующую ошибку, когда запускаете запрос LINQ 2 Entities:
System.NotSupportedException Unable to create a constant value of type 'System.Object'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.
var first = Context.Foos.First(); var again = Context.Foos.Where(f => f ==
first).Single();
var again = Context.Foos.Where(f => f.Id == first.Id).Single();
Запросы LINQ 2 Entities конвертируются в SQL, который ничего не знает о срванении ссылок на записи в таблице, но сравнение на основе основных ключей будет работать. Так же эта проблема может возникнуть из-за упаковки (boxing):
var wrong = Context.Foos.Where(f => f.SomeBoolean.Equals(true)).Single(); // runtime error var right = Context.Foos.Where(f => f.SomeBoolean
).Single(); // works
var wrong = Context.Foos .Where(f => f.SomeComplexType == null) .Single(); // runtime error var right = Context.Foos .Where(f => f.SomeComplexType.SomeString == null
) .Single(); // works var works = Context.Foos .Where(f => f.SomeEntity == null) .Single(); // works
var works = Context.Foos .Where(f => f.SomeEntity == null
) .Single(); // works
В запросах LINQ 2 Entities вы можете использовать как FirstOrDefault() так и SingleOrDefault в качестве последней операции запроса:
FirstOrDefault()
SingleOrDefault
var right = Context.Foos .Where(f => f.SomeBoolean
) .FirstOrDefault(); // works var works = Context.Foos .Where(f => f.SomeBoolean) .SingleOrDefault(); // works
var works = Context.Foos
.Where(f => f.SomeBoolean
)
.SingleOrDefault(); // works
var wrong = Context.Foos .Where(f => f.SomeBoolean
) .Select(f => f.Bars.SingleOrDefault()) .SingleOrDefault(); // Runtime error var right = Context.Foos .Where(f => f.SomeBoolean) .Select(f => f.Bars.FirstOrDefault()) .SingleOrDefault(); // works
var right = Context.Foos
.Select(f => f.Bars.FirstOrDefault()) .SingleOrDefault(); // works
FirstOrDefault