0

这个问题是这个问题的后续: 如何从两个值创建列表

考虑这段代码:

class MainClass() 
{
   string MainKey {get;set;}
   string MainName {get;set;}
   IEnumerable<SmallObject> MainList {get;set} 
}

class SmallObject() 
{
   string SmallKey {get;set} 
} 

和:

var mainQuery = (from v from DataContext.myTable
                 select v);

var myQuery = (from v in mainQuery
               select new MainClass()
               {
                  MainKey = v.Field1,
                  MainName = v.Field2,
                  MainList = new []
                  {
                     new SmallObject { SmallKey = v.Field3 },
                     new SmallObject { SmallKey = v.Field4 },
                  }
                });


var result1 = myQuery.ToList();

//Changing datatypes for optimization reasons in SQLServer2000
var cmd = DataContext.GetCommand(myQuery);
foreach (System.Data.Common.DbParameter param in cmd.Parameters)
{
  // nvarchar -> varchar
  // decimal -> numeric
}
var result2 = DataContext.Translate<MainClass>(cmd.ExecuteReader()).ToList();

result1.MainList 没问题

result2.MainList 为空

原始查询在 SQLServer2000 上运行非常缓慢,我在更改数据类型时修复了它(Linq 使用 nvarchar 和 decimal,因为我的数据库使用 varchar 和 numeric)

因此,我希望 result2 与 result1 相同,但是在执行这样的 DataContext.Translate 时不会发生这种情况。

有什么想法在这里得到相同的结果吗?

我也尝试过匿名类型,如下所示:

IEnumerable<object> MainList {get;set;}
...
MainList = new []
{
   new { SmallKey = v.Field3},
   new { SmallKey = v.Field4},
}

但结果是一样的:

4

2 回答 2

1

我认为您对 Translate 的要求太高了。

如果我理解正确,这是第一个查询(mainQuery)太慢了,所以我想替换它。

我会创建一个更简单的临时类,比如

 public class TmpClass
 {
    public string Field1 {get;set;}
    public string Field2 {get;set;}
    public string Field3 {get;set;}
    public string Field4 {get;set;}
 } 

一旦列表采用这种格式,您就可以使用第二个查询将其更改为 MainClass 列表。

只是一个兴趣,Linq输出的sql和你自定义的版本有什么区别?除非它进行一些转换,否则我不希望这种类型的查询需要优化。

于 2011-06-24T13:24:18.247 回答
0

我将使用AsEnumerable 扩展方法,该方法基本上将 转换为IQueryable强制IEnumerable处理枚举数的方法。您可以通过调用ToArray()或神奇ToList()地让您通过调用AsEnumerable()将其返回到IQueryableAsQueryable()

因此,可能执行以下操作对您有用:

var result1 = DataContext.myTable.AsEnumerable()
  .Select(v=> new MainClass {
                  MainKey = v.Field1,
                  MainName = v.Field2,
                  MainList = new []
                  {
                     new SmallObject { SmallKey = v.Field3 },
                     new SmallObject { SmallKey = v.Field4 },
                  }
         });
于 2011-06-24T13:38:36.793 回答