繁体   English   中英

将表<T>转换为某种东西

[英]cast Table<T> to something

我有一个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函数根本不起作用。 那你怎么处理它?

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

void DoSomethingWithTable(Table<IProductTag> table)

你应该有

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

这应该工作正常,假设您只需要读取实体(并应用查询运算符等)。 如果为你工作,请介绍你的方法需要做更多的细节。

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

我不知道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);
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM