我有一个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>
答案 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);
}