通用Linq DataContext

时间:2010-06-23 20:11:43

标签: c# linq generics

假设我有一个名为用户的表格。使用LINQ desinger,我将得到以下内容:

  • 名为 User.dbml
  • 的文件
  • 一个名为 UserDataContext 的数据上下文类,它来自 System.Data.Linq.DataContext
  • 的子类
  • 从User表映射的名为User的类。 UserDataContext对象将具有名为 Users 的属性,其类型为 System.Data.Linq.Table< User>

到目前为止一切顺利。现在我想定义一个通用基类,它将Linq.Table属性转换为所有子类的JSON字符串。所以我会:

using Newtonsoft.Json;

class BasePlugin<T> where T : System.Data.Linq.DataContext, new()
{
    protected T DataContext = new T();
    protected string GetJSONData()
    {            
        //*** DataContext if of type System.Data.Linq.DataContext, therefore it won't know the Linq Table property of its subclasses
        return JsonConvert.SerializeObject(DataContext.Cannot_get_subclass_property_Linq_table);
    }
}

要完成问题中的代码,这是一个子类的示例:

class UserPlugin : BasePlugin<UserDataContext>
{
    //The protected member DataContext inherited from BasePlugin 
    //has a property called Users of type System.Data.Linq.Table<User>.
    //The point to to avoid implementing GetJSONData() in all subclasses
}

总而言之,问题是如何避免在基类中实现GetJSONData()。

1 个答案:

答案 0 :(得分:6)

目前尚不清楚您想要哪张桌子。单个数据上下文中可能存在多个表。在您的特定模型中可能没有,但在LINQ to SQL中肯定会有。

如果有用,您可以致电DataContext.GetTable(Type)DataContext.GetTable<T>,并且可以按实体类型和上下文类型对您的类进行参数化:

class BasePlugin<TContext, TEntity> where TContext : DataContext, new()
    where TEntity : class
{
    protected TContext DataContext = new TContext();
    protected string GetJSONData()
    {            
        return JsonConvert.SerializeObject(DataContext.GetTable<TEntity>());
    }
}

这就是你要追求的吗?