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"];
}
这很好用
但我想要
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]]'的对象强制转换为'System.Collections.Generic.List`1 [FullSearch + kbc]
答案 0 :(得分:1)
在LINQ语句中定义PropertyCompany
:
var CountryCompanyDB = from b in dc.PropertyCompanies
where b.Country.Contains(txtSearch)
select new PropertyCompany()
{
ID = b.id,
Name = b.name,
};
ID
和Name
可能是PropertyCompany
类的可能属性名称。
答案 1 :(得分:0)
匿名类型应仅用作更复杂算法的中间类型。如果要将结果保存到变量中或将其传递给方法,则应创建特定的类。
答案 2 :(得分:0)
new {b.id , b.name}
是一种匿名类型,因此您无法方便地引用它。您应该使用代码中定义的常规类,或者使用Tuple<int,string>
(即select Tuple.Create(b.id, b.name)
) - 然后:
var result = (List<Tuple<int,string>>)Session["CountryCompany"];
答案 3 :(得分: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"];
答案 4 :(得分:0)
Session["CountryCompany"]
将不会持有List<PropertyCompany>
,而是将其设为<string,string>
的通用列表。执行ToList()
部分时,请查看类型。
答案 5 :(得分:0)
你可以做什么,使用匿名类型..在select中使用它们并在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;
}
这样可行,因为实际上,编译器知道新的{Age = c.Age,Position = c.Pos}的类型(它会为此生成其他信息)。
一旦你认可List,那么你已经转换为object(放到Session),你就不能再获得类型信息了。
我会介绍一些真实的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"];