如何为相同的LINQ 2 SQL表创建外观?

时间:2009-09-23 13:07:03

标签: c# linq-to-sql

我正在使用一个14岁的架构,其中父表(P)包含一个类型(8种可能性)和位置(3种可能性)字段,它们一起指向24个特定表中的一个(A1,A2) ,A3,B1,B2,B3 ......),所有类型都有相同的模式。

我想创建一种访问特定表的通用方法,但似乎无法使其正常工作。

假设父表名为Document,两种特定类型(NewLetter,CurrentLetter和HistoricLetters)和(NewBill,CurrentBill和HistoricBills)。

 public interface ILetter
 {
     DateTime CreationDate { get; }
 }

 public interface IBill
 {
     DateTime BillDate { get; }
 }

 // The LINQ 2 SQL generated classes already implement the CreationDate property
 public partial class NewLetter : ILetter { }
 public partial class CurrentLetter : ILetter { }
 public partial class HistoricLetter : ILetter { }

然后在我的代码中,我希望能够做到这一点:

 switch (type)
 {
   case 1:
     Table<IBill> specificBill;
     switch (location)      
     {
        ...
     }

   case 2:
     Table<ILetter> specificTable;
     switch (location)
     {
       case 1: specificTable = dataContext.NewLetter as Table<ILetter>; break;
       case 2: specificTable = dataContext.CurrentLetter ...
       case 3: specificTable = dataContext.HistoricLetter ...
      }   
 }

或类似的东西。不幸的是,即使NewLetter实现了ILetter,我也无法将Table<NewLetter>强制转换为Table<ILetter>。有没有办法解决?我想我基本上是想在C#中创建一个视图,因为我没有在db本身创建一个视图的权限。

2 个答案:

答案 0 :(得分:1)

DataContext有一个通用的方法来检索你想要的表:

var table = dataContext.GetTable<NewLetter>();

也许你可以用它来重写你的查询:

var table = dataContext.GetTable<NewLetter>();
var letters = 
    from letter in table
    where ...
    select letter as ILetter;

答案 1 :(得分:0)

查看Linq2SQL中的继承。你的表需要某种鉴别器列/属性。