0

Так что у меня эта настройки моделиMVC запрос к IEnumerable свойства класса

public class ListOfThings 
{ 
    public int Id {get;set;} 
    public List<int> DefaultRanks {get;set;} 

    static public IEnumerable<ListOfThings> ListOfDefault{ 
     get { 
      listOfDefault = new List<ListOfDefault>(); 
      listOfDefault.Add(N1); 
      listOfDefault.Add(N2); 
      listOfDefault.Add(N3); 
      return listOfDefault.AsReadOnly(); 
     } 
    } 

    static public ListOfThings N1{ get { return new ListOfThings { Id = 1, Addend = new List<int> { 1 }}; } } 
    static public ListOfThings N2{ get { return new ListOfThings { Id = 2, Addend = new List<int> { 1,2 }}; } } 
    static public ListOfThings N3{ get { return new ListOfThings { Id = 3, Addend = new List<int> { 1,2,3 }}; } } 

    static private ListOfThings n1; 
    static private ListOfThings n2; 
    static private ListOfThings n3; 
    static private List<ListOfThings> listOfDefault; 
} 

И всякий раз, когда я пытаюсь запросить, что статический IEnumerable, это даст мне нулевое значение.

var test = ListOfThings.ListOfDefault.Where(a => a.Id == 2); 

И если я попытаюсь это сделать, это даст мне предупреждение о броске.

ListOfThings test = ListOfThings.ListOfDefault.Where(a => a.Id == 2); 

Любые советы ценится ..

Спасибо !! -G

+1

Что все это нужно делать с ASP.NET MVC, или Entity Framework? Это как раз LINQ для объектов, насколько я могу видеть ... –

ответ

1

Есть некоторые проблемы в вашем коде. Изменения, которые я сделал являются:

// in a getter 
listOfDefault = new List<ListOfDefault>(); 
// should be: 
listOfDefault = new List<ListOfThings>(); 

// static getters 
static public ListOfThings N1{ get { return new ListOfThings { Id = 1, Addend = new List<int> { 1 }}; } } 
static public ListOfThings N2{ get { return new ListOfThings { Id = 2, Addend = new List<int> { 1,2 }}; } } 
static public ListOfThings N3{ get { return new ListOfThings { Id = 3, Addend = new List<int> { 1,2,3 }}; } } 
// should be: 

static public ListOfThings N1 { get { return new ListOfThings { Id = 1, DefaultRanks = new List<int> { 1 } }; } } 
static public ListOfThings N2 { get { return new ListOfThings { Id = 2, DefaultRanks = new List<int> { 1, 2 } }; } } 
static public ListOfThings N3 { get { return new ListOfThings { Id = 3, DefaultRanks = new List<int> { 1, 2, 3 } }; } } 

И самое главное, вы не называйте FirstOrDefault() на вашем LINQ (если вы хотите получить больше объектов использовать ToList()):

var test = ListOfThings.ListOfDefault.Where(a => a.Id == 2).FirstOrDefault();

Таким образом, он должен работать.

+0

Да, я видел то, что мне не хватало .. Спасибо! Btw, в чем разница между использованием «.Where (x => x ...). FirstOrDefault()» и «.FirstOrDefault (x => x ....)»? Извините, пожалуйста, noob на этом .. – gdubs

+0

@ gdubs: Нет никакой разницы - последнее проще ИМО. –

2

Непонятно, что вы подразумеваете под «это даст мне нулевое значение» - я бы оспаривал это с кодом, который вы указали. (Короткий, но полная программа демонстрирует проблему действительно поможет.)

Вторая линия, безусловно, даст сбой во время компиляции, на том основании, что Where возвращает IEnumerable<ListOfThings>, не одногоListOfThings. Вы можете что-то вроде:

ListOfThings test = ListOfThings.ListOfDefault.SingleOrDefault(a => a.Id == 2); 

Обратите внимание, что вы никогда не инициализации или с помощью n1, n2 или n3 в коде вы дали. Я бы также предположить, что итератор блок сделает вашу собственность ListOfDefault проще:

static public IEnumerable<ListOfThings> ListOfDefault { 
    get { 
     yield return N1; 
     yield return N2; 
     yield return N3; 
    } 
} 
+0

Спасибо за ответ, я думаю, что это было то, чего мне не хватало, но вместо «SingleOrDefault» работал «FirstOrDefault». Ну, ошибка «null exception error», которую я получал, указывала на область «a.Id == 2» всякий раз, когда я отлаживаю. был не совсем уверен в том, что происходило до тех пор, пока вы не упомянули SingleOrDefault! Благодаря! – gdubs

+0

@gdubs: вы получили бы 'NullReferenceException', если бы вы использовали' n1' вместо 'N1' и т. Д. ... возможно ли, что это произошло? –

+0

Хм .. что ты имеешь в виду? как «доходность возврата n1»? ну, я достал частную статику (например, n1, n2) и просто оставил публичные, и попробовал старую строку, и она все еще делает это. В чем разница между «доходностью доходности» и просто использованием личного статического списка, который у меня есть, и добавлением к нему значений?Мне любопытно, как я увидел это в методе «validate» атрибута Ivalidatable, то, как он добавляет значения, используется «yield return new ValidationResult». – gdubs

1

Я попытался воссоздать проблему, было несколько проблем. Я вставил код ниже

public class ListOfThings 
{ 
    public int Id { get; set; } 
    public List<int> DefaultRanks { get; set; } 

    static public IEnumerable<ListOfThings> ListOfDefault 
    { 
     get 
     { 
      listOfDefault = new List<ListOfThings>(); 
      listOfDefault.Add(N1); 
      listOfDefault.Add(N2); 
      listOfDefault.Add(N3); 
      return listOfDefault.AsReadOnly(); 
     } 
    } 

    static public ListOfThings N1 { get { return new ListOfThings { Id = 1, DefaultRanks = new List<int> { 1 } }; } } 
    static public ListOfThings N2 { get { return new ListOfThings { Id = 2, DefaultRanks = new List<int> { 1, 2 } }; } } 
    static public ListOfThings N3 { get { return new ListOfThings { Id = 3, DefaultRanks = new List<int> { 1, 2, 3 } }; } } 

    static private ListOfThings n1; 
    static private ListOfThings n2; 
    static private ListOfThings n3; 
    static private List<ListOfThings> listOfDefault; 
} 



class Program 
{ 
    static void Main(string[] args) 
    { 
     var test = ListOfThings.ListOfDefault.Where(a => a.Id == 2); 
     IEnumerable<ListOfThings> ds = ListOfThings.ListOfDefault.Where(a => a.Id == 2); 

    } 
} 


ListOfThings test = ListOfThings.ListOfDefault.Where(a => a.Id == 2); 

возвращается IEnumerable не единственный Objectif вы хотите одного или первый объект сделать что-то вроде

ListOfThings ds = ListOfThings.ListOfDefault.Where(a => a.Id == 2).FirstOrDefault(); 
Смежные вопросы