Asp.net mvc mvc查询类的ienumerable属性

Asp.net mvc mvc查询类的ienumerable属性,asp.net-mvc,linq,entity-framework,entity-framework-4.1,ienumerable,Asp.net Mvc,Linq,Entity Framework,Entity Framework 4.1,Ienumerable,所以我有这个模型设置 public class ListOfThings { public int Id {get;set;} public List<int> DefaultRanks {get;set;} static public IEnumerable<ListOfThings> ListOfDefault{ get { listOfDefault = new List<ListOfDefaul

所以我有这个模型设置

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;
}
如果我尝试这样做,它会给我一个演员警告

ListOfThings test = ListOfThings.ListOfDefault.Where(a => a.Id == 2);
如蒙指教,不胜感激

谢谢!!
-G

不清楚您所说的“它将给我一个空值”是什么意思-对于您所给出的代码,我会对此提出质疑。(一个简短但完整的程序来演示这个问题确实会有帮助。)

第二行肯定会给出编译时失败,原因是
其中
返回一个
IEnumerable
,而不是一个
物品列表
。您可能需要以下内容:

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;
   }
}
静态公共IEnumerable ListOfDefault{
得到{
收益率N1;
收益率N2;
收益率N3;
}
}

不清楚您所说的“它会给我一个空值”是什么意思-我会用您所给出的代码来反驳这一点。(一个简短但完整的程序来演示这个问题确实会有帮助。)

第二行肯定会给出编译时失败,原因是
其中
返回一个
IEnumerable
,而不是一个
物品列表
。您可能需要以下内容:

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;
   }
}
静态公共IEnumerable ListOfDefault{
得到{
收益率N1;
收益率N2;
收益率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 } }; } }
//在getter中
listOfDefault=新列表();
//应该是:
listOfDefault=新列表();
//静电吸气剂
静态公共物品列表N1{get{返回新物品列表{Id=1,Addend=new List{1};}
静态公共物品列表N2{get{返回新物品列表{Id=2,Addend=new List{1,2};}
静态公共物品列表N3{get{返回新物品列表{Id=3,Addend=new List{1,2,3};}
//应该是:
静态公共ListOfThings N1{get{返回新的ListOfThings{Id=1,DefaultRanks=new List{1};}
静态公共ListOfThings N2{get{返回新的ListOfThings{Id=2,DefaultRanks=new List{1,2};}
静态公共物品列表N3{get{返回新物品列表{Id=3,DefaultRanks=new List{1,2,3};}
最重要的是不要在LINQ上调用FirstOrDefault()(如果要获取更多对象,请使用ToList()):

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


这样应该可以工作。

代码中存在一些问题。我所作的改动是:

// 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 } }; } }
//在getter中
listOfDefault=新列表();
//应该是:
listOfDefault=新列表();
//静电吸气剂
静态公共物品列表N1{get{返回新物品列表{Id=1,Addend=new List{1};}
静态公共物品列表N2{get{返回新物品列表{Id=2,Addend=new List{1,2};}
静态公共物品列表N3{get{返回新物品列表{Id=3,Addend=new List{1,2,3};}
//应该是:
静态公共ListOfThings N1{get{返回新的ListOfThings{Id=1,DefaultRanks=new List{1};}
静态公共ListOfThings N2{get{返回新的ListOfThings{Id=2,DefaultRanks=new List{1,2};}
静态公共物品列表N3{get{返回新物品列表{Id=3,DefaultRanks=new List{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);

我试图重现这个问题,但没有什么问题。我已将代码粘贴到下面

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);

这些与ASP.NET、MVC或实体框架有什么关系?就我所见,这只是LINQ到对象的问题……这与ASP.NET、MVC或实体框架有什么关系?就我所见,这只是LINQ to Objects…谢谢你的回复,我想这是我所缺少的,但是“FirstOrDefault”起作用了,而不是“SingleOrDefault”。嗯,每当我调试时,我得到的“null异常错误”都指向“a.Id==2”区域。在你提到SingleOrDefault之前,我并不确定发生了什么!谢谢@gdubs:如果您使用
n1
而不是
n1
等,您将得到一个
NullReferenceException
。。。有可能就是这样吗?嗯…你什么意思?比如“收益率n1”?好吧,我拿出了私人的静态数据(如n1,n2),离开了公共的静态数据,尝试了旧的线路,它仍然在做。“收益率-收益率”和仅仅使用我拥有的私有静态列表并向其中添加值之间有什么区别?我有点好奇,因为我在Ivalidatable属性的“validate”方法中看到了这一点,它添加值的方式是使用“yield return new ValidationResult”。@gdubs:Yes-如果您使用的是
n1
,则会给您一个空值,因为它从未初始化过。同样,如果您遇到问题,那么一个简短但完整的程序将非常有用。至于使用
yield return
而不是使用静态变量:目前您的代码不是线程安全的,一方面……不,我想我已经完成了整个工作。我只是对收益率很好奇。那么这比我当时的做法安全吗?“return list of default.AsReadOnly();”我刚刚读到,它比我正在使用的版本节省了内存或其他更好的东西..谢谢你的回复,我想这是我所缺少的,但不是