将表<t>转换为</t>

时间:2011-03-08 15:41:41

标签: c# linq

我有一个datacontext,它有Authors表。

public partial Author:IProductTag{}

我想将Table<Authors>对象转换为Table<IProductTag>,但这似乎是不可能的。我试图这样做,因为我希望我的方法能够使用不同的表作为输入参数。更具体地说,我需要执行表的OrderBy和Select方法。我有很少的其他表,其实体实现IProductTag。另外,我试着写一个像:

这样的函数
public static void MyF<t>(){ 
Table<t> t0 = (Table<t>)DataContext.GetMyTableUsingReflection(); 
}

但它在编译时失败了。如果我将表格转换为类似ITable或IQueriable的东西,则OrderBy和Select函数根本不起作用。那你怎么处理它?<​​/ p>

2 个答案:

答案 0 :(得分:5)

我怀疑你想让你的方法通用 - 所以而不是

void DoSomethingWithTable(Table<IProductTag> table)
你应该

void DoSomethingWithTable<T>(Table<T> table) where T : class, IProductTag

这应该可以正常工作,假设您只需要读取实体(并应用查询运算符等)。如果 不适合您,请提供有关您的方法需要做的更多详细信息。

(你说你尝试使用反射失败了,但是你没有用方式说明它失败了。你能提供更多细节吗?)

答案 1 :(得分:0)

我不知道ProductTag是什么,所以我使用了不同的类型来展示我对此问题的解决方案。是的,似乎没有办法获得Table<T>,但你可以得到IQueryable<T>同样有效(至少在我的情况下)。

我有一个简单的分析数据库,每个网站都有自己的表,包含通用和特定项目。我想使用共享数据的接口。

public interface ISession 
{
    public DateTime CreateDt {get; set; }
    public string HostAddress {get; set; }
    public int SessionDuration {get; set; }
}

public static IQueryable<ISession> GetQueryableTable(MyDataContext db, string site)
{
     Type itemType;

     switch (item) 
     {
        case "stackoverflow.com":
            itemType = typeof(Analytics_StackOverflow);
            break;

        case "serverfault.com":
            itemType = typeof(Analytics_ServerFault);
            break;

        default: throw Exception();
     }

     return db.GetTable(itemType).Cast<ISession>();
}

然后您可以执行以下查询:

  var table = GetQueryableTable(db, "stackoverflow.com");
  var mySessions = table.Where(s => s.HostAddress == MY_IP);

要创建新行,您可以使用反射:

  var rowType = typeof(Analytics_ServerFault); 
  var newRow =  (ISession) rowType.GetConstructor(new Type[0]).Invoke(new object[0]);

(我有一个获取GetRowType的函数 - 这里没有显示)。

然后插入表中我有一个单独的辅助函数:

 public static void Insert(MyDataContext db, ISession item) 
 {
     // GetTable is defined by Linq2Sql
     db.GetTable(GetRowType(domain)).InsertOnSubmit(item);
 }