Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一步查询和赋值_C#_Linq - Fatal编程技术网

C# 一步查询和赋值

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=

我有一个类有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="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 
                         };