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