Свойства частичного класса недоступны через запрос LINQ, привязанный к GridView



Я добавил частичный класс к классу, созданному Entity Framework. Я хотел добавить вычисляемое поле, которое я мог бы привязать к своему GridView. Однако, когда я пытаюсь получить доступ к новому свойству, я получаю сообщение об ошибке, что это ограничение для Entity Framework.



Существуют ли какие-либо обходные пути для достижения этой цели?

596   1  

1 ответ:

Без просмотра вашего кода будет невозможно правильно диагностировать вашу проблему. Однако у меня есть предчувствие...

Создание частичного класса и добавление к нему вычисляемого свойства не является проблемой вообще. Привязка этого же свойства к GridView также не является проблемой, потому что GridView не волнует, пока свойство является общедоступным, и доступ к нему сам по себе не создает исключение.

однако..... возможно, вы пытаетесь использовать это свойство в запросе. Entity framework и любой другой ORM будет блевать на этот, потому что нет трансляции этого свойства в базовое хранилище данных (вероятно, SQL Server). Поэтому, когда EF пытается построить SQL, необходимый для запроса базы данных, он пугается и говорит "я понятия не имею, как превратить это свойство в допустимый SQL"

Убедитесь, что вы не используете это свойство в запросах, и все будет в порядке.

Обновление:

Если вы действительно хотите иметь возможность использовать вычисляемый столбец в результирующем наборе, то у вас есть два основных варианта:

1.) Создайте представление в базе данных с вычисляемым столбцом и привяжите к нему свою сущность вместо исходной базовой таблицы. Теперь ваша собственность будет законно привязана к чему-то, что может быть оспорено.

2.) Убедитесь, что вы выполнили запрос и вернули полный (нефильтрованный) результирующий набор, а затем используйте обычный LINQ to Object, чтобы получить то, что вы хотите. Что-то вроде это:

var query = from o in Context.Orders
            where o.Price > 100
            select o;

var orders = from order in query.ToList() // Force query to execute
             where order.ComputedColumn == 42
             select order;
Очевидно, что это менее эффективно, чем вариант один, но не может быть ужасно в зависимости от исходного запроса.

Comments

    Ничего не найдено.