Как обрезать значения с помощью Linq to Sql? - PullRequest
7 голосов
/ 16 марта 2009

В базе данных у меня есть таблица с именем Contact. Имя и другие подобные строковые поля предназначены для использования типа данных Char (не мой дизайн базы данных). Мой объект Contact отображается в строковый тип в свойствах. Если бы я хотел сделать простой тест для извлечения объекта Contact по id, я бы сделал что-то вроде этого:

Contact contact = db.Contacts.Single(c => c.Id == myId);
Contact test = new Contact();
test.FirstName = "Martin";

Assert.AreEqual(test.FirstName, contact.FirstName);

Значение contact.FirstName равно "Martin" из-за типа char. Где я могу перехватить свойство FirstName при его загрузке? OnFirstNameChanging (строковое значение) не вызывается при начальной загрузке (контакте), но вызывается для тестового объекта.

Ответы [ 5 ]

8 голосов
/ 16 марта 2009

Может быть, вы могли бы поместить его в частичный метод OnLoaded ()? Примечание: я никогда не использовал это, но я предполагаю, что это будет выглядеть так:

public partial class Contact
{
    partial void OnLoaded()
    {
        FirstName = FirstName.Trim();
    }
}
6 голосов
/ 16 марта 2009

Если вы не можете изменить схему, вы можете захотеть сделать созданный дизайнером метод доступа приватным / защищенным и создать общедоступный метод доступа, чтобы обработать свойство в частичной реализации класса. Затем вы можете обрезать значение в методе доступа get.

public partial class Contact
{

    public string RealFirstName
    {
       get { return this.FirstName.Trim(); }
       set { this.FirstName = value; }
    }

    ...
}
1 голос
/ 16 марта 2009

Это зависит от вашего контроля над схемой и кодом.

Если значения устанавливаются путем вызова конструктора со всеми параметрами, выполните обрезки и т. Д., Как они назначены переменным-членам.

Если они назначены свойствам (возможно, из примера), измените аксессор SET, чтобы он выполнял там обрезку.

У вас действительно есть потенциальные проблемы, если вы действительно ХОТИТЕ лидирующие или конечные пробелы в какой-то момент.

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

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

1 голос
/ 16 марта 2009
Contact contact = db.Contacts.Single(c => c.Id.Trim() == myId);

И убедитесь, что поставщик LINQ преобразует это в соответствующий SQL.

0 голосов
/ 16 марта 2009

Вы можете запустить ForEach в своем списке контактов, прежде чем пытаться найти Мартина.

var contacts = db.Contacts.ForEach(c => c.FirstName = c.FirstName.Trim());
Contact contact = contacts.Single(c => c.Id == myId);
contact.FirstName // = "Martin"

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

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