Ошибка ForEach over Object - PullRequest
       26

Ошибка ForEach over Object

2 голосов
/ 10 января 2012

У меня есть запрос в методе, поэтому я могу вызвать i из нескольких мест, например:

private object GetData(ProfilePropertyDefinition lProfileProperty)
{   
    return from r in gServiceContext.CreateQuery("opportunity")
           join c in gServiceContext.CreateQuery("contact") on ((EntityReference)r["new_contact"]).Id equals c["contactid"] into opp
           from o in opp.DefaultIfEmpty()
           where ((EntityReference)r["new_channelpartner"]).Id.Equals(lProfileProperty.PropertyValue) && ((OptionSetValue)r["new_leadstatus"]).Equals("100000002")
           select new
           {
               OpportunityId = !r.Contains("opportunityid") ? string.Empty : r["opportunityid"],
               CustomerId = !r.Contains("customerid") ? string.Empty : ((EntityReference)r["customerid"]).Name,
               Priority = !r.Contains("opportunityratingcode") ? string.Empty : r.FormattedValues["opportunityratingcode"],
               ContactName = !r.Contains("new_contact") ? string.Empty : ((EntityReference)r["new_contact"]).Name,
           };
}

Затем в другом методе я вызываю метод запроса примерно так и пытаюсь пройти через него:

var exportData = GetData(lProfileProperty);
foreach (var lItem in exportData)
{
}

Затем в том же методе, когда я пытаюсь перебрать результаты, я получаю эту ошибку на foreach:

оператор foreach не может работать с переменными типа «объект», поскольку «объект» не содержит общедоступного определения для «GetEnumerator»

Любая идея, что вызвало бы и как это исправить, я в тупике.

EDIT:

Прислушался к совету Джона и, по большей части, похоже, работает. Но когда я вызываю метод вроде: GetData<lProfileProperty.PropertyValue>; Он говорит, что lProfileProperty не может быть найден. Но это там. Есть идеи?

РЕДАКТИРОВАТЬ 2: У меня есть все из примера Джона на месте. Я получаю одну ошибку: на foreach (GridDataItem lItem in exportData) написано «Ошибка 67: невозможно преобразовать тип« DotNetNuke.Modules.CPCLeadShare.View.Foo »в« Telerik.Web.UI.GridDataItem ». Есть идеи, как это исправить? Мне нужно иметь возможность использовать DGridDataItem, чтобы я мог получить доступ к "Ячейкам".

Ответы [ 7 ]

5 голосов
/ 10 января 2012

Компилятор говорит вам, в чем проблема: вы не можете перебирать что-то, что имеет статический тип object. Исправьте тип возврата вашего GetData метода, чтобы он возвращал что-то, что реализует IEnumerable.

Поскольку вы возвращаете последовательность анонимного типа, вы можете сделать это, просто изменив код на

private IEnumerable GetData(ProfilePropertyDefinition lProfileProperty) 

Однако вы не сможете получить доступ к свойствам объектов, кроме как с помощью отражения. Чтобы исправить это, вам нужно создать новый класс и вернуть его экземпляры. Например:

class Foo {
    public string OpportunityId { get; set; }
    public string CustomerId { get; set; }
    public string Priority { get; set; }
    public string ContactName { get; set; }
}

, а затем

private IEnumerable<Foo> GetData(ProfilePropertyDefinition lProfileProperty) {
   // ...
   select new Foo
       { 
           OpportunityId = !r.Contains("opportunityid") ? string.Empty : r["opportunityid"], 
           CustomerId = !r.Contains("customerid") ? string.Empty : ((EntityReference)r["customerid"]).Name, 
           Priority = !r.Contains("opportunityratingcode") ? string.Empty : r.FormattedValues["opportunityratingcode"], 
           ContactName = !r.Contains("new_contact") ? string.Empty : ((EntityReference)r["new_contact"]).Name, 
       }; 
    // ...
}
3 голосов
/ 10 января 2012

Ваш метод возвращает object. объект не реализует IEnumerable<T>. Вы также не сможете привести к IEnumerable<T>, потому что ваш метод использует анонимный тип.

Ваш единственный вариант - создать конкретный класс для возвращаемого типа метода.

2 голосов
/ 10 января 2012

Вам необходимо вернуть тип GetData (), который реализует IEnumerable. Я предлагаю связать объект в сигнатуре метода с IEnumerable.

IEnumerable содержит метод GetEnumerator (), который позволяет циклу foreach работать.

1 голос
/ 10 января 2012

Вы получаете ошибку, потому что переменная, полученная от GetData(...), имеет тип object. Вы не можете перечислить object, потому что это то, чем оно является - объект, а не коллекция. Чтобы перечислить результат вызова метода, необходимо привести объект к типу, который является коллекцией, и поэтому имеет a GetEnumerator(...) метод.

1 голос
/ 10 января 2012

ваш метод возвращает object, а не коллекцию или список любого вида

0 голосов
/ 10 января 2012

Попробуйте что-то вроде этого:

private object GetData(ProfilePropertyDefinition lProfileProperty)
{
    var result = from r in gServiceContext.CreateQuery("opportunity")
                 join c in gServiceContext.CreateQuery("contact") on ((EntityReference)r["new_contact"]).Id equals c["contactid"] into opp
                 from o in opp.DefaultIfEmpty()
                 where ((EntityReference)r["new_channelpartner"]).Id.Equals(lProfileProperty.PropertyValue) && ((OptionSetValue)r["new_leadstatus"]).Equals("100000002")
                 select new    
                 {
                     OpportunityId = !r.Contains("opportunityid") ? string.Empty : r["opportunityid"],
                     CustomerId = !r.Contains("customerid") ? string.Empty : ((EntityReference)r["customerid"]).Name,
                     Priority = !r.Contains("opportunityratingcode") ? string.Empty : r.FormattedValues["opportunityratingcode"],
                     ContactName = !r.Contains("new_contact") ? string.Empty : ((EntityReference)r["new_contact"]).Name,
                 });

                 return result.ToList();
    }

и

foreach (var lItem in List<object>GetData(lProfileProperty))
{
}

и добавьте класс

select new  [YouClassView]  
                 {
                     OpportunityId = !r.Contains("opportunityid") ? string.Empty : r["opportunityid"],
                     Custo
0 голосов
/ 10 января 2012

Вам нужно вернуть IEnumerable<Some>, чтобы иметь возможность зацикливаться на нем.В настоящее время вы возвращаете только object.

Но вы не можете вернуть анонимный тип из метода, поэтому вам нужно объявить определенный тип:

class Foo
{
    ...
}

private IEnumereable<Foo> GetDate()
{
    return ...
           select new Foo
           {
               ...
           };
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...