mvc查询类的不可相关属性

时间:2012-01-26 09:40:52

标签: 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<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

3 个答案:

答案 0 :(得分:2)

你不清楚你的意思是“它会给我一个空值” - 我会对你给出的代码提出异议。 (一个简短但完整的程序来证明这个问题确实会有所帮助。)

第二行肯定会导致编译时失败,理由是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;
   }
}

答案 1 :(得分: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 } }; } }

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

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

这种方式应该可行。

答案 2 :(得分: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();