Ограничение результатов System.Data.Linq.Table <T> - PullRequest
3 голосов
/ 17 сентября 2008

Я пытаюсь наследовать от сгенерированного текста данных в LinqToSQL - что-то вроде этого

public class myContext : dbDataContext {
 public System.Data.Linq.Table<User>() Users {
  return (from x in base.Users() where x.DeletedOn.HasValue == false select x);
 }
}

Но мой оператор Linq возвращает IQueryable, который не может быть приведен к Table. Кто-нибудь знает способ ограничения содержимого Linq.Table? помечены как удаленные Возможно, я все об этом ошибаюсь - любые предложения будут с благодарностью.

Hal

Ответы [ 8 ]

2 голосов
/ 17 сентября 2008

Другим подходом будет использование представлений ..

CREATE VIEW ActiveUsers as SELECT * FROM Users WHERE IsDeleted = 0

Что касается linq to sql, это то же самое, что и таблица. Для любой таблицы, для которой вам требовалась фильтрация DeletedOn, просто создайте представление, использующее этот фильтр, и используйте его вместо таблицы в контексте данных.

1 голос
/ 18 сентября 2008

Инкапсулируйте ваш DataContext, чтобы разработчики не использовали Table в своих запросах. У меня есть свойство «Все» в моих репозиториях, которое выполняет фильтрацию, аналогичную той, которая вам нужна. Итак, запросы выглядят так:

from item in All
where ...
select item

и все может быть:

public IQueryable<T> All
{
    get { return MyDataContext.GetTable<T>.Where(entity => !entity.DeletedOn.HasValue); }
}
1 голос
/ 17 сентября 2008

Вы можете использовать наследование столбцов дискриминатора в таблице, т.е. таблица DeletedUsers и таблица ActiveUsers, где в столбце дискриминатора указано, что и к чему. Затем в своем коде просто ссылайтесь на ActiveUsers Users.OfType, который никогда не будет содержать ничего удаленного.

Как примечание: как, черт возьми, вы делаете это с уценкой?

Users.OfType<ActiveUsers>

Я могу получить это в коде, но не в строке

0 голосов
/ 18 сентября 2008

Я обнаружил проблему, связанную с отношениями / ассоциациями, которые не отображаются в представлениях. Кажется, что вы должны пройти через каждый класс в dbml и установить первичный ключ для представлений, так как он не может извлечь эту информацию из схемы. Сейчас я нахожусь в процессе установки первичных ключей и планирую перейти к маршруту просмотра, чтобы изолировать только не удаленные элементы.

Спасибо, и я обновлю позже.

0 голосов
/ 18 сентября 2008

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

Добавьте пару таблиц с одинаковыми отношениями и сравните их с видом, который не отображается.

Кроме того, иногда обновление подключения к обозревателю сервера не работает должным образом, и объекты изначально не создаются правильно, если только мы не удалим их из конструктора, не закроем проект, затем снова откроем проект и добавим их снова из проводника сервера. Предполагается, что вы используете Visual Studio 2008 с конструктором linq to sql .dbml.

0 голосов
/ 17 сентября 2008

Возможно, мой комментарий к ответу Кевена Шеффилда может пролить некоторый свет на то, чего я пытаюсь достичь:

У меня есть похожий репозиторий для большинства моего доступа к данным, но я пытаюсь быть в состоянии пересечь мои отношения и поддерживать логику DeletedOn, без фактического вызова дополнительные методы. Объекты опрошен (орфография исправлена) с помощью StringTemplate процессор, который не может вызывать методы (только реквизит / поля).

Мне в конечном итоге понадобится эта фильтрация DeletedOn для всех таблиц в моем приложении. Унаследованное решение класса от Скотта Николса должно работать (хотя мне нужно будет вывести класс и отношения для примерно 30 таблиц - ой), хотя мне нужно выяснить, как проверить нулевое значение в моем свойстве Значение разграничителя производного класса.

Я могу просто расширить все мои классы специально для обработки StringTemplate, явно добавив свойства для нужных мне отношений, я просто хотел бы иметь возможность вызывать StringTemplate [пользователя] и заставлять его проходить через все.

0 голосов
/ 17 сентября 2008

В этих условиях я создал класс репозитория, который возвращает IQueryable, но в основном это просто

из t в _db.Table
выберите т;

на это обычно ссылается tableRepository.GetAllXXX (); но у вас может быть tableRepository.GetAllNonDeletedXXX (); это помещает в это предварительное предложение where для удаления удаленных строк. Это позволило бы вам возвращать удаленные, не восстановленные и все строки, используя разные методы.

0 голосов
/ 17 сентября 2008

Вы можете использовать хранимую процедуру, которая возвращает все сопоставленные столбцы в таблице для всех записей, которые не помечены как удаленные, а затем сопоставить класс LINQ to SQL с результатами хранимой процедуры. Я думаю, что вы просто перетащите сохраненный процесс в Server Explorer в класс в конструкторе LINQ to SQL.

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