我有一个有3个属性的类:
class Three
{
int ID {get; set;}
string Name {get; set;}
double Value {get; set;}
}
然后我有一个返回Queryable<Three>
的linq查询,但只在表中定义了ID和名称。
var three = from t in db.Threes
select t;
three = { {ID=1, Name="A", Value=0},{ID=2, Name="B", Value=0},...}
所以Value没有在db.Threes表中定义,所以默认为0,因为双倍。然后我遍历var three
中的每个项目,根据另一个表设置Value:
for (int i = 0; i < three.Count(); i++)
{
three[i].Value = (from v in db.Values
where v.ThreeID = i.ID
select v.Value).First();
}
return three;
Querayble<Three>
three
现在包含.Value的定义:
three = { {ID=1, Name="A", Value=99},{ID=2, Name="B", Value=100},...}
我要做的关键是仍然返回Queryable<Three>
,但也要设置Value属性。 有没有更好的方法来执行此操作而不是使用for循环?我希望能够将此扩展到具有从另一个表分配的Value属性的任何类;假设我有一个四级课程:
class Four
{
int ID {get; set;}
string Name {get; set;}
DateTime Date {get; set;}
double Value {get; set;}
}
第一个查询将填充ID,Name和Date,我仍然希望能够分配Value。我觉得有一种更好的方法可以用linq做到这一点,我无法想出来。
编辑:假设我正在调用db.GetTable<T>
,而Three和Four是实现.Value接口的通用参数。我无法显式实例化泛型类型,因为我必须对属性进行硬编码。
答案 0 :(得分:2)
我认为您正在寻找join。您正在从另一个表中分配值,该表的id与Three
表相同。
您可以像这样构建一个Three
对象:
var three = from t in db.Threes
join v in db.Values on t.ID equals v.ThreeID
select new Three{
ID = t.ID,
Name = t.Name,
Value = v.Value
};
你之前通过循环做的事情,这是一个性能打击。发生的事情是你调用数据库来循环它,然后对于每个循环,你再次回调数据库。如果你的表是通过那些ID链接的,那么使用这个代码会产生1个单独的数据库调用而没有内存循环。
答案 1 :(得分:1)
假设你有一些共同密钥,那么简单连接怎么办?
var things = from t in db.Threes
join v in db.Values on t.SomeId equals v.SomeId
select new Three { ID = t.ID,
Name = t.Name,
Value = v.Value
};