Я знаю, что запросы Entity Framework не могут содержать массивы. Например, это будет терпеть неудачу:Почему мы не можем использовать массивы в запросах Entity Framework?
var myRow = DbContext.myTable.Single(d => d.Property1 == myArray[0].Property1);
Но если я задаю этот элемент в переменную первой, как это:
var property1 = myArray[0].Property1;
var myRow = DbContext.myTable.Single(d => d.Property1 == property1);
Затем он работает. Почему компилятор не может сделать это для нас? Он уже делает оптимизацию и дает нам ярлыки через синтаксический сахар во многих других обстоятельствах. Есть ли источник неоднозначности, который мешает компилятору копировать элемент массива во временную переменную в фоновом режиме? Или какая-то другая причина?
Это не ограничение компилятора C#, а поставщик Linq to Entities. –
Потому что в вашей второй части кода вы работаете с постоянным значением, которое, в свою очередь, может быть частью выражения. Ваш linq в первой части кода не может быть преобразован в выражение. –
Существует много похожих (не совсем повторяющихся) обсуждений почти каждого конкретного метода/свойства, которое не переводится на SQL поставщиками LINQ-to-EF/LINQ-to-SQL. То есть http://stackoverflow.com/questions/3360772/linq-contains-case-insensitive имеет хорошие ссылки на другие обсуждения. –