簡體   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