在单个步骤中查询和分配

本文关键字:分配 查询 单个步 | 更新日期: 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 
                              };