将Table<T>转换为其他类型

4
我有一个数据上下文,其中包含作者表。
public partial Author:IProductTag{}

我希望将 Table<Authors> 对象转换为 Table<IProductTag>,但似乎不可能。我试图这样做是因为我想让我的方法能够处理作为输入参数的不同表格。更具体地说,我需要执行表格的 OrderBy 和 Select 方法。我还有其他几个表格,它们的实体实现了 IProductTag 接口。此外,我尝试编写一个类似于以下函数的函数:
public static void MyF<t>(){ 
Table<t> t0 = (Table<t>)DataContext.GetMyTableUsingReflection(); 
}

但是它在编译时失败。如果我将表格强制转换为ITable或IQueryable之类的内容,则OrderBy和Select函数根本不起作用。那么你该如何处理呢?


Authors 是否实现了 IProductTag 接口?如果没有,它是部分类吗? - Justin Morgan
2个回答

5
我猜您想让您的方法更加通用 - 因此,不是使用具体的实现:
void DoSomethingWithTable(Table<IProductTag> table)

你应该拥有

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

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

(您说尝试使用反射失败了,但您没有说明它以何种方式失败。您能否提供更多细节?)


void DoSomethingWithTable<T>(Table<T> table) where T : IProductTag 不起作用,我得到了以下错误:错误4:类型“T”必须是引用类型,才能将其用作泛型类型或方法“System.Data.Linq.Table<TEntity>”中的参数“TEntity”。 - Bogdan Verbenets
我可以使用反射获取Authors表,但我无法将其转换为Table<IProductTag>。 - Bogdan Verbenets
确实!必须指定“class”关键字。 - Bogdan Verbenets

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);
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接