Ограничивающие результаты System.Data.Linq.Таблица<T>

StackOverflow https://stackoverflow.com/questions/85457

  •  01-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь наследовать от моего сгенерированного datacontext в 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, который не может быть приведен к таблице - кто-нибудь знает способ ограничить содержимое Linq.Таблица - я пытаюсь быть уверенным, что при любом обращении к моей таблице пользователей она не возвращает те, которые помечены как удаленные.Возможно, я все делаю неправильно - я был бы очень признателен за любые предложения.

Хэл

Это было полезно?

Решение

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

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

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

Другие советы

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

В качестве дополнительного примечания, как, черт возьми, вы делаете это с markdown?

Users.OfType<ActiveUsers>

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

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

from item in All
where ...
select item

и все могло бы быть:

public IQueryable<T> All
{
    get { return MyDataContext.GetTable<T>.Where(entity => !entity.DeletedOn.HasValue); }
}

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

Что я сделал в этих обстоятельствах, так это создал класс репозитория, который передает обратно IQueryable, но в основном это просто

из t в _db.Таблица
выберите t;

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top