Entity Framework избегает извлечения столбца, если явно не запрошено - PullRequest
3 голосов
/ 31 марта 2011

У меня есть таблица SQL, в которой хранится запись о человеке, где один столбец является изображением. Я использую таблицу в приложении ASP.Net MVC и хочу получить только столбец изображения в действии контроллера, которое используется моим атрибутом источника изображения HTML.

Как я могу предотвратить получение столбца, в котором хранится изображение, с помощью моего запроса LINQ, не прибегая к явному запросу каждого желаемого столбца, но при этом получая возможность получать его с помощью явного запроса?

Это выражение LINQ, в которое я не хочу возвращать столбец изображения (имеется около десятка включений, поэтому явное указание каждого свойства недопустимо):

Person person = (from per in entities.People.Include(...).Include(..) 
                 where per.ID == id 
                 select per).FirstOrDefault();

Выражение LINQ, которое я использую для получения изображения:

byte[] picture = (from per in entities.People 
                  where Per.ID == id 
                  select per.Picture).FirstOrDefault();

Ответы [ 4 ]

3 голосов
/ 31 марта 2011

Вы должны использовать разбиение таблицы .Смысл разделения таблицы заключается в том, что вы не касаетесь своей базы данных, а сопоставляете несколько объектов в одну таблицу.

Ваша сущность Person больше не будет содержать Image, но вместо этого будет содержать свойство навигации к сущности PersonImage.Новый объект будет содержать только Id (так же, как связанное лицо => отношение один к одному) и Image.Свойство навигации может быть загружено только при необходимости.Вы не можете избежать загрузки скалярного свойства, если не используете проекцию или представление запроса (которое вы, вероятно, не хотите использовать).

1 голос
/ 31 марта 2011

Учитывая, что существует множество причин разделить таблицу, когда у вас есть один большой, но редко используемый раздел, зачем решать эту проблему на стороне кода?Ваш лучший вариант, вероятно, разбить изображения в отдельной таблице, которая связана с первой.Ваш sql сервер будет счастливее, а код - чище.

1 голос
/ 31 марта 2011

В зависимости от того, как вы используете EF4 (База данных сначала? Модель сначала?), Вы можете создать представление (и другую сущность), которое не содержит вашего изображения.Или вы можете использовать определяющий запрос на стороне вашей модели: http://blogs.msdn.com/b/davidebb/archive/2010/10/01/the-easy-way-to-create-an-entity-framework-defining-query.aspx

0 голосов
/ 31 марта 2011
var smallPerson = from per in entities.People.Include(...).Include(..) 
                  where per.ID == id 
                  select new Person() {
                    .Name = per.Name,
                    .Surname = per.Surname
                  }).FirstOrDefault();

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

var smallPerson = from per in entities.People.Include(...).Include(..) 
                  where per.ID == id 
                  select new {
                    .Name = per.Name,
                    .Surname = per.Surname
                  }).FirstOrDefault();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...