2011-03-31 3 views
3

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

Как я могу предотвратить, чтобы столбец, хранящий изображение, был извлечен из моего запроса 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(); 
+0

У вас есть контроль над вашей схемой базы данных? –

+0

Да, но он в производстве и будет болезненным для изменения. – sipwiz

ответ

3

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

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

+0

Я сделал это для очень похожего случая, как sipwiz, и он отлично работает. –

+0

Это будет отлично работать, если вы не хотите указывать столбцы. – Slappy

+0

Отлично. Точно, что я был после. – sipwiz

0
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(); 
+0

Вот что я не хочу делать. У меня более десятка включений, которые создают довольно неприятный графа объектов, и я не хочу его вручную создавать в выборе. – sipwiz

+0

Нет, вы не можете. Подумайте о возможностях SQL. Вы не можете выполнить запрос с указанием «За исключением этих столбцов». EF Должен соответствовать возможностям SQL. Ваши другие варианты будут отражением или чем-то – Slappy

+0

, это все равно приведет к тому, что столбец изображения будет частью оператора SELECT. –

1

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

1

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

Смежные вопросы