2011-07-19 40 views
0
var CountryCompanyDB = from b in dc.PropertyCompanies where (b.Country.Contains(txtSearch)) select; 

Session["CountryCompany"] = CountryCompanyDB.ToList(); 

if(test==1) 
{ 
    var result = (List<PropertyCompany >)Session["CountryCompany"]; 
} 

選擇新的這個工作得很好在LINQ

,但我想

var CountryCompanyDB = from b in dc.PropertyCompanies where (b.Country.Contains(txtSearch)) select new {b.id , b.name}; 

Session["CountryCompany"] = CountryCompanyDB.ToList(); 

if(test==1) 
{ 
    var result = (List<PropertyCompany new {b.id , b.name}>)Session["CountryCompany"];//does not can this work 
} 

我要選擇新的Session [ 「CountryCompany」]如何能執行這項工作。

編輯

class kbc { 
    public Int64 id { get; set; } 
    public string name { get; set; } 
} 


    var CountryCompanyDB = from b in dc.PropertyCompanies where (b.Country.Contains(txtSearch)) select new { id=b.IdCompany ,name=b.NameCompany} ; 

if(test==1) 
{ 
    var result = (List<kbc>)Session["CountryCompany"]; 
} 

sayError:
無法轉換類型的對象 'System.Collections.Generic.List 1[<>f__AnonymousType0 2 [System.Int64,System.String]]' 爲類型「系統。 Collections.Generic.List`1 [FullSearch + KBC]

+2

downvote沒有任何評論是不公平的 –

回答

0

匿名對象,只要你是在局部範圍內工作。現在,一旦將它存儲在會話中並將其取回,編譯器需要知道檢索到的對象的類型。這樣你就可以創建一些DTO類型的東西來完成這項任務就像

public class DTOCompany 
{ 
    public int id{get;set;} 
    public string name{get;set;} 
} 

你可以使用這個對象在檢索它時,從會議回來,你可以將它轉換爲列表LINQ查詢像

var CountryCompanyDB = from b in dc.PropertyCompanies where (b.Country.Contains(txtSearch)) select new DTOCompany{id=b.id ,name = b.name}; 

DTOCompany像

var result = (List<DTOCompany>)Session["CountryCompany"]; 
+0

這個工作說錯誤 – ashkufaraz

+0

什麼樣的錯誤? –

+0

無法投射類型爲'System.Collections.Generic.List'1 [<> f__AnonymousType0'2 [System.Int64,System.String]]'的對象以鍵入'System.Collections.Generic.List'1 [FullSearch + DTOCompany ] – ashkufaraz

1

在LINQ的語句定義您PropertyCompany

var CountryCompanyDB = from b in dc.PropertyCompanies 
         where b.Country.Contains(txtSearch) 
         select new PropertyCompany() 
         { 
          ID = b.id, 
          Name = b.name, 
         }; 

其中IDNamePropertyCompany類的可能屬性名稱。

+0

我不明白這一點 – ashkufaraz

+0

@testcomeria:你應該基本上避免在會話中使用匿名類型。相反,使用您嘗試從其中檢索的相同類型,在這種情況下,使用'PropertyCompany'類。請注意,我是如何更改原始代碼中的'select'子句的。 –

+0

如何將其轉換爲會話 – ashkufaraz

0

匿名類型只能用作更復雜算法的中介。如果要將結果保存到變量中或將其傳遞到方法中,則應該創建特定的類。

0

new {b.id , b.name}是一個匿名類型,所以你不能方便地引用它。你應該使用在你的代碼中定義或者是定期類,或者一個Tuple<int,string>(即select Tuple.Create(b.id, b.name)) - 然後:

var result = (List<Tuple<int,string>>)Session["CountryCompany"]; 
+0

請詳細解釋 – ashkufaraz

+0

@ testcomeria詳細解釋...? –

+0

關於Tuple.create(b.id,b.name) – ashkufaraz

0

Session["CountryCompany"]不會拿着List<PropertyCompany>而是我推測像<string,string>這將是一個泛型列表。當您執行ToList()部件時,請檢查該類型。

0

你可以做什麼,與匿名類型..是使用它們在選擇和使用後它在foreach中。

var q = _someCollection.Where(c => c.Id == 100).Select (new { Id = c.Id, Name = c.Name}); 

foreach(var p in q) { 
    var id = p.Id; 
} 

這工作,因爲實際上,編譯器知道的新{年齡= c.Age,位置= c.Pos}(它會產生額外的信息爲)類型。

只要你轉移到列表,然後你已經轉換爲對象(放到會話),你不會再獲取類型信息。

我會介紹一些真實類型CountryInfo並更改查詢;

var q = _someCollection.Where(c => c.Id == 100).Select(new ContryInfo { Id = c.Id, Name = c.Name}). 

Session["a"] = q.ToList(); 

var list = (IList<ContryInfo>)Session["a"]; 
+0

q.tolist()說錯誤:不允許在查詢中顯式構造實體類型'PropertyCompany' – ashkufaraz