使用BaseClass虚拟属性</t>过滤Context.GetTable <t>

时间:2013-01-02 19:36:23

标签: c# generics linq-to-sql base-class

我们有一个非常广泛的LINQ-to-SQL映射,后端数据库包含大约150个表。几乎所有表都有一个名为CompanyCode的公共属性,它作为所有表中的一种分区。

我目前正在实施一个验证工具,该工具利用context.GetTable<T>来检索特定实体类型的记录。我希望按CompanyCode进行过滤,但一般来说,例如:

context.GetTable<T>().Where(t => t.CompanyCode == "1234").ToList();

因为,我们已经有了一个名为CPSQLEntityBase的自定义抽象基类,我的想法是添加一个自定义虚拟属性CompanyCode,它将在LINQ类中被覆盖,如this article中所述。 :

public abstract class CPSQLEntityBase
{
    public virtual string CompanyCode { get; set; }
}

我正在使用一个使用SqlMetal的自定义脚本来动态生成我们的DataContext类。因此,添加一个命令来查找/替换public string CompanyCode的所有public override string CompanyCode实例,以便它们覆盖基类中的虚拟属性,这是微不足道的。以下是其中一个例子:

public partial class Employee : CPSQLEntityBase, INotifyPropertyChanging, INotifyPropertyChanged
{
    ...
    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_CompanyCode", DbType="VarChar(4) NOT NULL", CanBeNull=false, UpdateCheck=UpdateCheck.Never)]
    [global::System.Runtime.Serialization.DataMemberAttribute(Order=124)]
    public override string CompanyCode
    {
        get
        {
            return this._CompanyCode;
        }
        set
        {
            ...
        }
    }

    ...
}

总而言之,我在LINQPad中编写了一个小测试脚本,它应该能够使用泛型方法请求Employee个实体,但是可以通过CompanyCode进行过滤。这是我的示例脚本:

void Main()
{
    ...
    Test<Employee>(context);
}

public void Test<T>(MyDataContext context)
    where T : CPSQLEntityBase
{
    var result = context.GetTable<T>().Where(t => t.CompanyCode == "1234").ToList();
}

但是,当我执行上面的代码时,我得到一个例外:

  

类成员CPSQLEntityBase.CompanyCode未映射。

自撰写博客文章以来,有什么变化吗?我错过了什么?

0 个答案:

没有答案