C# 一步查询和赋值
我有一个类有3个属性:C# 一步查询和赋值,c#,linq,C#,Linq,我有一个类有3个属性: class Three { int ID {get; set;} string Name {get; set;} double Value {get; set;} } 然后我有一个linq查询,它返回一个Queryable,但表中只定义了ID和名称 var three = from t in db.Threes select t; three = { {ID=1, Name="A", Value=0},{ID=2, Name=
class Three
{
int ID {get; set;}
string Name {get; set;}
double Value {get; set;}
}
然后我有一个linq查询,它返回一个Queryable
,但表中只定义了ID和名称
var three = from t in db.Threes
select t;
three = { {ID=1, Name="A", Value=0},{ID=2, Name="B", Value=0},...}
因此,值未在db.Threes表中定义,因此它与double一样默认为0。然后,我遍历var three
中的每个项目,以根据另一个表设置值:
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
,但还要设置Value属性有没有更好的方法来代替for循环?我希望能够将其扩展到任何具有从另一个表分配的Value属性的类;假设我有一个四班:
class Four
{
int ID {get; set;}
string Name {get; set;}
DateTime Date {get; set;}
double Value {get; set;}
}
第一个查询将填充ID、名称和日期,我仍然希望能够赋值。我觉得有一种更好的方法可以让linq做到这一点,我就是想不出来
Edit:假设我调用的是
db.GetTable
和三个和四个实为实现.Value接口的通用参数。我不能显式地实例化泛型类型,因为我必须对属性进行硬编码。假设您有一些公共密钥,那么简单的连接怎么样
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
};
我想你在找我。您正在分配另一个表中的值,该表的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链接,那么使用此代码只进行一次数据库调用,而不进行内存循环。如果
Three
确实是一种泛型类型,该怎么办?我不能在linq查询中调用构造函数?我想这就是我在结尾的四个部分想要表达的意思。我应该说得更清楚。不,你不能在linq语句中调用构造函数。请不要在标题中添加“C#linq”之类的标记。我们有标签,他们做得更好。
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
};