如何使用Linq to Sql修剪值?

时间:2009-03-16 20:13:19

标签: c# linq-to-sql

在数据库中,我有一个名为Contact的表。第一个名称和其他此类字符串字段旨在使用Char数据类型(而不是我的数据库设计)。我的对象Contact映射到属性中的字符串类型。如果我想通过id检索一个Contact对象的简单测试,我会这样做:

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

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

由于char类型,contact.FirstName值为“Martin”。我在哪里可以拦截FirstName属性? OnFirstNameChanging(字符串值)不会在初始加载(联系人)上调用,而是在测试对象上调用。

5 个答案:

答案 0 :(得分:8)

也许你可以把它放在OnLoaded()部分方法中?注意:我从未使用过这个,但我认为它看起来像这样:

public partial class Contact
{
    partial void OnLoaded()
    {
        FirstName = FirstName.Trim();
    }
}

答案 1 :(得分:6)

如果无法更改架构,则可能需要将设计器生成的访问器设置为private / protected,并在部分类实现中创建一个公共访问器以前端属性。然后,您可以在get访问器中修剪该值。

public partial class Contact
{

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

    ...
}

答案 2 :(得分:1)

Contact contact = db.Contacts.Single(c => c.Id.Trim() == myId);

并检查LINQ提供程序是否将其转换为适当的SQL。

答案 3 :(得分:1)

这取决于您对架构和代码的控制。

如果通过调用带有所有参数的构造函数来设置值,则在将它们分配给成员变量时进行修剪等。

如果将它们分配给属性(可能来自示例),请更改SET访问器,以便在那里进行修剪。

如果您确实想要在某些时候领先或尾随空格,那么确实存在潜在问题。

如果您无法修改基类代码,请尝试使用分部类,或继承该类并覆盖其中的属性。

如果你不能这样做,那么我的最后一个建议就是编写一个你传递创建对象的某种工厂类,并根据你想要的规则清理它。

答案 4 :(得分:0)

在尝试搜索Martin之前,您可以在联系人列表中运行ForEach

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

但是如果必须为多个字段完成,这种方式维护起来并不容易。