在单个步骤中查询和分配
本文关键字:分配 查询 单个步 | 更新日期: 2023-09-27 18:05:33
我有一个类,有3个属性:
class Three
{
int ID { get; set ;}
string Name { get; set; }
double Value { get; set; }
}
然后我有一个linq查询,返回一个Queryable<Three>
,但在表中只定义了ID和Name。
var three = from t in db.Threes
select t;
three = { {ID=1, Name="A", Value=0},{ID=2, Name="B", Value=0},...}
So Value在数据库中没有定义。three表,所以它默认为0,就像double一样。然后遍历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;
Queryable<Three>
three
现在包含。value:
three = { {ID=1, Name="A", Value=99},{ID=2, Name="B", Value=100},...}
我想做的关键是仍然返回Queryable<Three>
,但也要设置Value属性。
是否有更好的方法来代替使用for循环?
我希望能够将其扩展到任何具有从另一个表分配的值属性的类;假设我有一个类4:
class Four
{
int ID {get; set;}
string Name {get; set;}
DateTime Date {get; set;}
double Value {get; set;}
}
第一个查询将填充ID,名称和日期,我仍然希望能够分配值。我觉得linq有更好的方法来做到这一点,我只是想不出来。
编辑:假设我调用db.GetTable<T>
和三和四是真正实现.Value
接口的通用参数。我不能显式地实例化泛型类型,因为我必须硬编码属性。
我想你是在寻找加入。您正在分配另一个表的值,该表的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个数据库调用,没有内存循环。
假设有一些通用键,那么简单连接呢?
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
};