2011-06-24 16 views
0

這個問題是一個跟進這個問題: How to create a list from two values問題得到相同的結果,從DataContext.Translate

考慮以下代碼:

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的和小數,因爲我的數據庫使用VARCHAR和數字)

所以我想結果2是相同的result1,但是在做這樣的DataContext.Translate時不會發生這種情況。

在這裏得到相同結果的任何想法?

我也tryed匿名類型,像這樣:

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

,但結果是一樣的:

回答

1

我想你問的翻譯太多。

如果我正確理解你,它是第一個查詢(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與您的定製版本有什麼區別?除非是一些鑄造,否則我不希望這種類型的查詢需要優化。

+0

的差別是數據類型。出於某種原因,nvarchar和decimal在基於SQL2000的數據類型爲varchar和numeric的數據庫上運行得並不順利。我搜索不同的論壇,並發現其他類似的問題。 – hightow

0

我會使用AsEnumerable extension method,它基本上將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 }, 
        } 
     }); 
相關問題