单步查询和分配

时间:2011-08-13 04:07:30

标签: c# linq

我有一个有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接口的通用参数。我无法显式实例化泛型类型,因为我必须对属性进行硬编码。

2 个答案:

答案 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 
                              };