在linq中选择new

时间:2011-07-19 06:56:11

标签: c# asp.net linq linq-to-sql generics

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]

6 个答案:

答案 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,
                       };

IDName可能是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"];