Проблема с отложенной загрузкой и / или проекцией в поле Linq To Entities (MySql) - PullRequest
0 голосов
/ 24 июля 2010

Я использую Linq To Entities, чтобы я мог Linq к моей базе данных MySql.Моя проблема в том, что у меня есть таблица с большими текстовыми полями, поэтому я не хочу загружать их, если они мне не нужны, а модель отложенной загрузки L2E не работает, потому что (1) поставщик MySql не выглядитвообще поддерживать отложенную загрузку, и (2) даже если бы это было так, я не думаю, что это было бы так или иначе правильно.

Урезано, чтобы проиллюстрировать проблему, у меня есть большая таблица со столбцами: Id,Text1, Text2, Text3

У меня будет подпрограмма, которая должна работать только с Text1, и другая подпрограмма, которая работает с Text2.Поскольку содержимое текстовых полей большое, я действительно не хочу выбирать текстовые поля, которые я не использую для данной подпрограммы.

Другими словами, выполнение этого будет слишком дорогим:

Dim items = From i In db.MyTable Where [predicate]

Но при этом:

Dim items = From i In db.MyTable Where [predicate] Select i.Id, i.Text1

создает IQueryable (Of anonymous_type) вместо IQueryable (Of MyTable), и, поскольку мне нужно иметь возможность обновлять различные поля и вызыватьSaveChanges, мне нужны объекты MyTable для этого.Я не могу преобразовать анонимный тип в новую MyTable, потому что DataContext не узнает об этом и, следовательно, обновления не будут работать.

(И мне кажется (хотя это может быть моей нехваткой L2E)знание), что , даже если провайдер MySql поддерживал отложенную загрузку, это означало бы, что я мог бы указать отложенную загрузку для текстовых полей, но тогда он делал бы N запросов к серверу, пока я просматривал N записей.Другими словами, ленивая загрузка, кажется, нужна, когда вам может понадобиться столбец с большими данными, но, возможно, вам не понадобится, не тогда, когда вы знаете, , что вам нужен этот столбец, но вам не нужны другие столбцы.)

Итак, вопрос в том, как выбрать только те поля, которые мне нужны, но при этом получить объект нужного типа, чтобы я мог обновить его позже?

1 Ответ

0 голосов
/ 16 мая 2011

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

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

Другая вещь, которую вы можете сделать, это выбрать только те поля, которые вы хотите, но затем проецировать обратно в тип таблицы вместо использования анонимного типа, оставляя поля, которые вам не нужны. То есть вместо этого:

Dim items = From i In db.MyTable Where [predicate] Select i.Id, i.Text1

сделать это:

Dim items = From i In db.MyTable Where [predicate] Select New TableObject With {.Id = i.Id, .Text1 = i.Text1}

Затем, если вы хотите получить большие текстовые поля, запросите их явно в отдельном запросе.

Это немного раздражает, потому что вы должны явно заполнять поля, но это лучше, чем первоначальная проблема, и я уверен, что есть способ улучшить это дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...