[英]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.