выберите новый в linq - PullRequest
0 голосов
/ 19 июля 2011
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
}

Я хочу выбрать новый сеанс ["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 ]

1 голос
/ 19 июля 2011

Определите свой PropertyCompany в своем выражении LINQ:

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

Где ID и Name - возможные имена свойств вашего PropertyCompany класса.

0 голосов
/ 19 июля 2011

Что вы можете сделать, с анонимным типом ... это использовать их в 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, тогда вы конвертируете в объект (помещаете в 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"];
0 голосов
/ 19 июля 2011

Session["CountryCompany"] не будет содержать List<PropertyCompany>, но вместо этого это будет общий список, который я предполагаю как <string,string>.Проверьте тип при выполнении партии ToList().

0 голосов
/ 19 июля 2011

Анонимные объекты работают, пока вы находитесь в локальной области видимости. Теперь, когда вы сохранили его в сеансе и получили его обратно, компилятору необходимо знать тип полученного объекта. так что вы можете создать что-то типа 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 голосов
/ 19 июля 2011

new {b.id , b.name} является анонимным типом, поэтому к нему нельзя обращаться удобно. Вам следует использовать либо обычный класс, определенный в вашем коде, либо, возможно, Tuple<int,string> (т.е. select Tuple.Create(b.id, b.name)) - тогда:

var result = (List<Tuple<int,string>>)Session["CountryCompany"];
0 голосов
/ 19 июля 2011

Анонимные типы следует использовать только в качестве промежуточного для более сложного алгоритма.Если вы хотите сохранить результат в переменную или передать его в метод, вы должны создать определенный класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...