У меня есть эта ошибка в этом выражении linq:
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select new Payments
(
nalTmp.Dziecko.Imie,
nalTmp.Dziecko.Nazwisko,
nalTmp.Miesiace.Nazwa,
nalTmp.Kwota,
nalTmp.RodzajeOplat.NazwaRodzajuOplaty,
nalTmp.RodzajeOplat.TypyOplat.NazwaTypuOplaty,
nalTmp.DataRozliczenia,
nalTmp.TerminPlatnosci
)).ToList();
Есть идеи, как решить эту проблему? Я пытаюсь использовать любую комбинацию выражений ...: /
c#
linq-to-entities
netmajor
источник
источник
Ответы:
без дополнительной информации о «Платежах» это мало помогает, но при условии, что вы хотите создать объект Payments и установить некоторые из его свойств на основе значений столбца:
источник
Если вы по-прежнему хотите использовать свой конструктор для инициализации, а не свойства (иногда такое поведение желательно для целей инициализации), перечислите запрос, вызвав
ToList()
илиToArray()
, а затем используйтеSelect(…)
. Таким образом, он будет использовать LINQ to Collections, и это ограничение на невозможность вызова конструктора с параметрамиSelect(…)
исчезнет.Итак, ваш код должен выглядеть примерно так:
источник
ToX()
для этого, используйтеAsEnumerable()
.Только что столкнувшись с этой ошибкой, я подумал, что добавлю, что если
Payment
тип - astruct
, вы также столкнетесь с той же ошибкой, потому чтоstruct
типы не поддерживают конструкторы без параметров.В этом случае преобразование
Payment
в класс и использование синтаксиса инициализатора объекта решит проблему.источник
DateTime
(который является структурой) внутри моего запроса, что приводит к той же ошибке. извлечение его в локальную переменную исправило это для меня. Спасибо за подсказку по структуре.Если вы похожи на меня и не хотите заполнять свои свойства для каждого создаваемого вами запроса, есть другой способ решить эту проблему.
На данный момент у вас есть IQueryable, содержащий анонимный объект. Если вы хотите заполнить свой настраиваемый объект конструктором, вы можете просто сделать что-то вроде этого:
Теперь ваш настраиваемый объект (который принимает два объекта в качестве параметра) может при необходимости заполнять ваши свойства.
источник
Сначала я бы избегал решения с
Для этого требуется пустой конструктор и игнорируется инкапсуляция, поэтому вы говорите, что new Payments () является действительным платежом без каких-либо данных, но вместо этого объект должен иметь как минимум значение и, возможно, другие обязательные поля в зависимости от вашего домена.
Лучше иметь конструктор для обязательных полей, но приносить только необходимые данные:
источник
Вы можете попробовать сделать то же самое, но используя методы расширения. Какой провайдер использует базу данных?
источник
Просто перед утверждением .. фактический сохраняется как запрос, он еще не выполнил. После вызова вы играете с объектами, а затем можете использовать в запросе конструктор, отличный от конструктора по умолчанию.
ToList()
DbSet
Select
DbSet
ToList()
Не самый эффективный способ использования с точки зрения времени, но это вариант для небольших наборов.
источник
да, попробуйте вот так ....
это обновит ваш объект Payment с помощью конструктора без параметров, а затем инициализирует свойства, перечисленные в фигурных скобках
{ }
источник
()
в Payemnts нет необходимости, так что это может быть `select new Payments {// init values}В дополнение к вышеупомянутым методам вы также можете проанализировать его как коллекцию Enumerable, например:
Это также имеет дополнительное преимущество, облегчая жизнь при создании анонимного объекта, например:
Однако следует помнить, что анализ коллекции как Enumerable втягивает ее в память, поэтому она может потребовать значительных ресурсов! Здесь следует проявлять осторожность.
источник
Кроме того, если вы хотите использовать конструктор с несколькими объектами для инициализации, вы можете получить ошибку, если Linq не возвращает никаких значений.
Итак, вы можете сделать что-то вроде этого:
источник
Извините за опоздание на вечеринку, но, обнаружив это , я подумал, что этим следует поделиться, так как это самая чистая, быстрая и экономящая память реализация, которую я мог найти.
В соответствии с вашим примером вы должны написать:
Большие преимущества здесь (как указал Дэмиен Гард в комментариях по ссылке):
var foo = createPayments(bar);
, а также использование с помощью myIQueryable.ToPayments () возможно.источник
Сегодня у меня была такая же проблема, и мое решение было похоже на то, что указал Йода, однако оно работает только с плавным синтаксисом.
Адаптируя свое решение к вашему коду: я добавил следующий статический метод в класс объекта
а затем обновил базовый запрос до следующего:
Это логически эквивалентно решению Джеймса Мэннинга с тем преимуществом, что раздувание инициализации членов для класса / объекта передачи данных
Примечание. Первоначально я использовал более описательные имена, чем «Инициализатор», но после рассмотрения того, как я его использовал, я обнаружил, что «Инициализатор» было достаточно (по крайней мере, для моих целей).
Заключительное примечание:
придумав это решение, я изначально думал, что было бы просто поделиться одним и тем же кодом и адаптировать его для работы с синтаксисом запросов. Я больше не верю, что это так. Я думаю, что если вы хотите иметь возможность использовать этот тип сокращенной конструкции, вам понадобится метод для каждого (запрос, беглый), как описано выше, который может существовать в самом классе объекта.
Для синтаксиса запроса потребуется метод расширения (или какой-либо метод за пределами используемого базового класса). (поскольку синтаксис запроса хочет работать с IQueryable, а не с T)
Вот пример того, что я использовал, чтобы наконец заставить это работать для синтаксиса запросов. (Йода уже прибил это, но я думаю, что использование могло бы быть более ясным, потому что сначала я не понял этого)
и использование
источник
Хотя и поздно отвечать, он все же может помочь кому-то в беде. Поскольку LINQ to entity не поддерживает конструкции объектов без параметров. Однако методы проецирования IEnumerable .
Поэтому перед выбором просто преобразуйте свой IQueryable в IEnumerable с помощью этого кода:
Это будет работать нормально. Однако это, конечно, потеряет преимущества собственных запросов.
источник
источник