带接口的通用Linq查询

时间:2011-08-13 15:46:50

标签: c# linq

我有几个实现接口的数据库表IValue;这显然是一个例子,但我无法改变数据库设计:

public partial class Table1 : //Linq Table
{
    *int ID {get; set;}
    *string Name {get; set;}

}

public partial class Table2 : //Linq Table
{
   *int ID {get; set;}
   *int Height {get; set;}
   *int Width {get; set;}
}

public partial class Table1 : ValueCollection<Table1>, IValue
{
   double Value {get; set;}
}

public partial class Table2 : ValueCollection<Table2>, IValue
{
   double Value {get; set;}
}

表中物理上包含用asterkisk表示的属性。然后,我可以运行一个查询,从任一表中选择相关数据:

class ValueCollection<T> where T : IValue
{
IQueryable<T> Collection
{
    using (Database db = new Database())
    {
      var results = from t in db.GetTable<T>
                    select t;

      //results = {{ID = 1, Name = "A", Value = 0},
      //           {ID = 2, Name = "B", Value = 0},
      //           ...}

然后我使用for循环填充.Value属性:

      for (int i = 0; i < results.Count(); i++)
      {
         results[i].Value = (from v in db.Values
                          where v.KeyID = results[i].ID
                          select v.Value).First();
      }

      return results; 
    }
 }
 }

我希望能够以某种方式将for循环组合到第一个linq查询中,但我不知道如何使用该接口。第一个查询选择所有相关数据从Table1表中,然后第二个填充.Value属性。我无法在linq查询中使用初始化器语法,因为我必须对Table1或Table2中的属性进行硬编码。

我正在做一个连接,但我明确地返回一个类型T而不是一个匿名类型。是否有可能将此转换为连接查询,然后将结果作为Queryable<T>返回而不显式分配属性?

编辑:根据Jon的请求更新了代码。

如果我这样做,结果不应该有ID属性吗?

foreach (var s in Table1.Collection) {Console.WriteLine(s.ID)};

这与做同样的事情:

(from t in db.Table1s
select t);

t将具有ID和Name属性,而Value将被取消分配。

0 个答案:

没有答案