我有几个实现接口的数据库表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将被取消分配。