Как вы просматриваете объект, который был возвращен из IEnumerable? - PullRequest
1 голос
/ 20 декабря 2011

У меня есть класс, который возвращает список регионов в базе данных, используя Linq to SQL (передавая переменные RegionName и RegionID).Проблемы возникают, когда я пытаюсь получить данные внутри.Я могу видеть значения при отладке кода (выглядят так: {RegionID = 1, RegionName = "Asia"}).Это также при использовании цикла foreach для просмотра каждого возвращенного элемента / строки.

Есть идеи, как их разбить, чтобы я мог получить значения для каждого?используемый оператор LINQ:

return (from r in db.Regions
        join c in db.Countries on r.RegionID equals c.RegionId
        join i in db.Programs on c.CountryID equals i.CountryID
        select new { r.RegionID, r.RegionName })
        .Distinct();

Ответы [ 3 ]

4 голосов
/ 20 декабря 2011

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

public class RegionData // or whatever is appropriate
{
     public int RegionID { get; set; }
     public string RegionName { get; set; } 
}

И измените ваш запрос, чтобы выбрать RegionData

 select new RegionData 
 { 
      RegionID = r.RegionID,
      RegionName = r.RegionName 
 }

И ваш метод должен вернуть IEnumerable<RegionData>.

IEnumerable<RegionData> GetRegionData(/* parameter list */) {

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

0 голосов
/ 20 декабря 2011

Вы возвращаете анонимный тип, но он приводится к object, блокируя прямой доступ к его использованию.

Здесь вы можете сделать несколько разных вещей.Одним из них является создание типа для этого случая:

public struct Region
{
  public int RegionID{get; set;}
  public string RegionName{get; set;} 
}

Затем используйте select new Region{r.RegionID, r.RegionName} в своем запросе.Это позволяет вам вернуть либо IEnumerable<Region>, либо IQueryable<Region>.

Еще одна вещь, которую вы можете сделать, - привести объект из перечисления к dynamic.Затем вы можете вызывать этих членов с поздней привязкой.

Наконец, вы можете использовать подходы, основанные на отражении.Игра с объектами PropertyInfo обычно намного сложнее, чем здесь стоит, но учтите, что это используется за кулисами с DataBinder.Eval(), поэтому, если вы использовали свое перечисление с Repeater или подобным элементом управления, то ваш код в письменном видеотлично работает с DataBinder.Eval(Container.DataItem, "RegionID")

0 голосов
/ 20 декабря 2011

У вас есть 2 варианта: вы можете получить перечислитель или выполнить итерацию с foreach. Ваш запрос:

   (from r in db.Regions
    join c in db.Countries on r.RegionID equals c.RegionId
    join i in db.Programs on c.CountryID equals i.CountryID
    select new { r.RegionID, r.RegionName })
   .Distinct();

создает анонимный тип, на который вы можете легко смотреть , пока вы делаете это в рамках метода или блока кода.

Как только вы потеряете область действия, вам придется использовать отражение, чтобы посмотреть на анонимный тип. В рамках метода, вот ваши варианты:

Вариант 1

var query = (from r in db.Regions
             join c in db.Countries on r.RegionID equals c.RegionId
             join i in db.Programs on c.CountryID equals i.CountryID
             select new { r.RegionID, r.RegionName })
            .Distinct();

// get the enumerator
var enumerator = query.GetEnumerator();
enumerator.Reset();

while(enumerator.MoveNext()){
    var obj = enumerator.Current;
    // you can now use the query's anonymous properties
}

Вариант 2

foreach(var obj in query){
    // much easier to access the properties
} 

Если вы собираетесь выйти за рамки метода или кодового блока, создайте класс для этих свойств, как предлагает @AnthonyPeagram.

Для получения дополнительной информации см. MSDN: GetEnumerator

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