2011-03-04 23 views
4

我想弄清楚如何使用我的方法使用LINQ查詢動態變量。例如,工作正常:IQueryable方法不解決動態查詢變量

using (DBDataContext db = new DBDataContext()) 
{ 
    var query = from c in db.Users 
       select 
       new 
       { 
        c.Firstname, 
        c.Lastname, 
        c.Age 
       }; 

    gridUsers.VirtualItemCount = query.Count(); 
    gridUsers.DataSource = query.ToList(); 
} 

但是,這並不工作:

using (DBDataContext db = new DBDataContext()) 
{ 
    dynamic query = from c in db.Users 
       select 
       new 
       { 
        c.Firstname, 
        c.Lastname, 
        c.Age 
       }; 

    gridUsers.VirtualItemCount = query.Count(); 
    gridUsers.DataSource = query.ToList(); 
} 

的錯誤是:「對象」不包含「計數」的定義。我怎樣才能使用動態關鍵字?

回答

10

你不得不使用:

gridUsers.VirtualItemCount = Queryable.Count(query); 
gridUsers.DataSource = Enumerable.ToList(query); 

動態類型不 「做」 擴展方法。 (我不是完全是肯定爲什麼編譯器存儲了大量關於調用站點的信息 - 它必須基本上存儲與調用站點相關的所有using指令,它也會減慢動態綁定的速度,這可能是他們試圖避免的問題。也許這只是太多的工作,爲太少的好處。)

編輯:只是出於興趣,爲什麼你試圖使用動態類型爲您的序列第一個地方?我懷疑你會發現像這樣的各種事情變得更加棘手...... LINQ很大程度上依賴於各種類型推斷。

請注意,有一個IQueryable<dynamic>IEnumerable<dynamic>是好的,並會工作得更好。

+2

有趣的(也許)想法 - 需要隱藏'使用'也可能干擾沉默的未使用的引用刪除...也有人可能會抱怨(也許不合理地)它泄露代碼信息。 – 2011-03-04 08:00:12

+0

@Marc:關於未使用的參考刪除的有趣點,是的。伊克。很高興我不必非常使用'dynamic' :) – 2011-03-04 08:09:24

+0

是的,這是我從未真正使用過的最大功能......我想我/我們不會落入目標羣體中...... – 2011-03-04 08:30:17