Технические характеристики ObjectDataSource и LINQ - PullRequest
1 голос
/ 25 апреля 2011

У меня небольшой вопрос по LINQ.

У меня есть коллекция категорий (около 100). Некоторые из них - дети другой категории. Это IList этого типа:

 public Guid TempID { get; set; }
 public Nullable<int> ID { get; set; }
 public bool Published { get; set; }
 public int CategoryLevel { get; set; }
 public int CategoryOrder { get; set; }
 public DateTime UpdatedDate { get; set; }
 public Nullable<int> RefParent { get; set; }
 public bool GotChildren { get; set; }

Каков наилучший подход, если я хочу представить этот тип в DataList (потенциально DataList из DataList, DataList и т. Д.), Используя ASP.net . Другая техническая особенность заключается в том, что количество детей не является статичным В настоящее время у нас есть 3 глубины, но она может легко иметь 5.

Должен сказать, что я не могу изменить, где и как возвращаются данные, потому что это происходит из-за внешнего API. Что я должен сделать, это просто показать их.

Спасибо, и не стесняйтесь спрашивать меня более подробно. Я из Квебека и обычно говорю по-французски, так что, может быть, я не очень хорошо говорю по-английски.

Редактировать
Должен сказать, что я знаю, как связать данные с DataList. Моя проблема заключается в том, как я могу привязать DataBist списка данных (и не знаю глубины) к простому списку измерений, который содержит все уровни. Возможно ли это?

1 Ответ

2 голосов
/ 25 апреля 2011

для потомков ...
List<Category> categories должно быть в порядке. Свойства выставляются через что-то вроде:

categories[0].TempID

Вы можете запустить LINQ для коллекции:

var catIDs = from cat in categories
             where cat.ID.HasValue == true
             select cat;

UPDATE_3:

Хорошо, теперь я понимаю - вы получаете объект, который выглядит следующим образом:

 public Guid TempID { get; set; }
 public Nullable<int> ID { get; set; }
 public bool Published { get; set; }
 public int CategoryLevel { get; set; }
 public int CategoryOrder { get; set; }
 public DateTime UpdatedDate { get; set; }
 public Nullable<int> RefParent { get; set; }
 public bool GotChildren { get; set; }

... а вам нужно уметь добавлять коллекции дочерних категорий?

Если вы не можете наследовать класс, я бы использовал объект следующим образом:

class MyCategory
{
    // add fields for respective Category properties
    // or just the following
    Category category;
    List<Category> subCategories;

    MyCategory (Category category)
    {
        this.category = category;

        if (this.category.GotChildren)
        {
            // query TempIDs, Level, etc. from collection of Categories
            // and assign to subCategories collection
        }
    }

    // add property getters/setters as needed
    public List<Category> SubCategories
    { get { return subCategories; } }
}

... внешне, звоните:

bool TryGetSubCategories (MyCategory myCategory, out DataList myDataList)
{
    if (myCategory.GotChildren)
    {myDataList.DataSource = myCategory.SubCategories;}

    return myCategory.GotChildren;
}  

Обновлен метод для работы аналогично Dictionary.TryGetValue ();

UPDATE_2:

Вам потребуется добавить свойство коллекции (ICollection, List<T> и т. Д.) К вашему типу:

 public Guid TempID { get; set; }
 public Nullable<int> ID { get; set; }
 public bool Published { get; set; }
 public int CategoryLevel { get; set; }
 public int CategoryOrder { get; set; }
 public DateTime UpdatedDate { get; set; }
 public Nullable<int> RefParent { get; set; }
 public bool GotChildren { get; set; }
 public List<Categories> SubCategories {get; set;} // add this

Это добавит неограниченную глубину. Я не понимаю, почему не может использовать DataList в качестве типа данных SubItems.

UPDATE:

После более тщательного изучения класса DataList вы должны использовать ICollection в качестве источника данных. MSDN показывает, что List<T> наследуется от ICollection & ICollection<T>. IList наследуется от ICollection; в то время как IList<T> наследуется от ICollection<T>.

MSDN также имеет образец .

...