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时,它都会给我一个null值。

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

如果我尝试这样做,它会给我一个演员警告。

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

如有任何建议,不胜感激。。

谢谢!!-G

不清楚你所说的"它会给我一个null值"是什么意思——我对你给出的代码表示异议。(一个简短但完整的演示问题的程序将非常有帮助。)

第二行肯定会给出编译时失败,理由是Where返回的是IEnumerable<ListOfThings>,而不是单个ListOfThings。你可能想要这样的东西:

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

请注意,您从未在给定的代码中初始化或使用n1n2n3。我还建议使用迭代器块来简化ListOfDefault属性:

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

您的代码中存在一些问题。我所做的改变是:

// 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 } }; } }

最重要的是不要在LINQ上调用FirstOrDefault()(如果你想获得更多的对象,请使用ToList()):

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

这样它就应该起作用。

我试图重新创建这个问题,但几乎没有问题。我已经在下面粘贴了代码

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而不是单个对象如果您希望单个对象或第一个对象执行类似的操作

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

最新更新