Не удается неявно преобразовать тип 'Program.Data.View' в System.linq.iqueryable, - PullRequest
0 голосов
/ 28 сентября 2018

Цель / проблема: Я пытаюсь использовать First или FirstOrDefault, чтобы вернуть только 1 результат из базы данных.Я получаю следующую ошибку:

Невозможно неявно преобразовать тип 'Program.Data.view' в System.Linq.Iqueryable. Существует явное преобразование (если вы пропустили приведение)

То, что я пробовал: После просмотра документации и многих статей SO, я попробовал разные способы приведения, включая приведенный ниже код.Такие статьи, как Невозможно неявно преобразовать тип 'System.Linq.IQueryable <> в.Существует явное преобразование (вам не хватает приведения?) .Большинство статей идет от System.Linq.IQueryable <> к чему-то другому, а не к этому направлению.В любом случае приведение должно быть относительно простым, что мне не хватает ?:

IQueryable<Program.Data.view> someVariable = db.view.First(m => m.ID == Search_ID);

Моя подпись метода:

public IQueryable<Program.Data.view> GetDataFromQuery()

Ответы [ 4 ]

0 голосов
/ 01 октября 2018

В итоге получилось следующее:

var someVariable = db.view.Where(m => m.Some_ID == Search_SomeID).GroupBy(x => x.Some_ID).Select(g => g.OrderByDescending(p => p.Column_Two).FirstOrDefault()).AsQueryable().OrderBy(x => x.Column_Three);

AKA (формат):

Where().GroupBy().Select(...OrderByDescending().FirstOrDefault()).AsQueryable().OrderBy();

Не уверен, почему другие дали мне ошибки, но работа в этом порядке сработала., OrderBy в самом конце кажется совершенно ненужным по логике, но я получаю ошибку System.NotSupportedException, когда у меня ее нет (метод «Пропустить» поддерживается только для отсортированного ввода в LINQ to Entities. Метод «OrderBy»должен быть вызван до того, как метод «Пропустить» ... это происходит в .DataBind ())

0 голосов
/ 28 сентября 2018

Если вы не можете изменить подпись вашего GetDataFromQuery или хотите сохранить отложенное выполнение, вы можете использовать этот подход:

db.view.Where(m => m.ID == Search_ID).Take(1);

Обратите внимание, что эта замена не является строго эквивалентной: она будетне выбрасывать, даже если db.view не имеет данных

0 голосов
/ 28 сентября 2018

Когда вы используете такой метод, как: First(), FirstOrDefault(), Single(), SingleOrDefault(), Count() и что-то подобное, возвращайте тип данных, которые вы отображали в Entity-Framework.

Когда вы работаете с Entity-Framework, знаете ли вы, когда EF получает данные от database?

Посмотрите этот пример:

var result = context.Student.Where(x=>x.Id == model.Id);

В этом примере результаттип IQueryable<T> и не вызывал базу данных, это просто запрос.

Теперь посмотрите этот пример:

var result = context.Student.Where(x=>x.Id == model.Id).ToList();

В этом примере тип результата - T ивызвал базу данных, и у нас есть данные о Student Таблица.

Внимание, что метод ToList() или ToListAsync() всегда вызывает базу данных и выполняет запрос.

0 голосов
/ 28 сентября 2018

First() и аналогичные методы (например, FirstOrDefault() или Count() или Average()) не возвращают IQueryable<Program.Data.view> и не используют отложенное выполнение.

First() выполняется немедленно и возвращает только один (ну, первый ) Program.Data.view.

Таким образом, сообщение об ошибке является правильным.Измените свою подпись на

public Program.Data.view GetDataFromQuery()

и указанную строку на:

Program.Data.view someVariable = db.view.First(m => m.ID == Search_ID);
...