2012-12-19 1 views
1

У меня есть два ObservableCollection с именем Customer и Group в проекте Silverlight MVVM, который использует Entity Framework.Как присоединиться к двум ObservableCollection в один ObservableCollection с помощью LINQ join Query в silverlight

Мне нужно присоединиться к этому двум ObservableCollection и создать новый ObservableCollection с именем Final. Присоединение состоит из использования Условий.

первый ObservableCollection имел следующие поля

cid, groupid uname 
1 2  Raj 
2 3  Jeya 

второй ObservableCollection имел следующие поля

groupid groupname 
2  Traveler 
3  Shopper 

и мой финальный стол выглядит следующим образом

uname groupname 
Raj Traveler 
Jeya Shopper 

Есть в любом случае, чтобы получить это конечный результат ..?

ответ

1

Если вы просто создать ObservableCollection из объединения (как это было предложено в других ответах), ваша коллекция не будет «наблюдаемым.» То есть, изменения в исходных коллекциях не будут распространяться. Чтобы распространять изменения, вам необходимо создать новый класс коллекции, который реализует INotifyCollectionChanged.

В следующем коде я поднимаю действие CollectionChanged с помощью Reset, которое запрашивает у подписчика повторный загрузку всего результата соединения. Это происходит медленнее, но если вам нужны конкретные обновления для каждого элемента, вам необходимо тщательно отследить изменения. Это намного сложнее. В этом случае, вероятно, не нужно использовать LINQ.

public class Customer { public int cid; public int groupid; public string uname; } 
public class Group { public int groupid; public string groupname; } 
public class CustomerGroup { public string Name { get; set; } public string Groupname { get; set; } } 

public class ObservableJoinOfCustomersGroups : IList<CustomerGroup>, INotifyCollectionChanged 
{ 
    readonly ObservableCollection<Customer> customers; 
    readonly ObservableCollection<Group> groups; 

    List<CustomerGroup> cachedJoin; 

    public ObservableJoinOfCustomersGroups(ObservableCollection<Customer> customers, ObservableCollection<Group> groups) 
    { 
     this.customers = customers; 
     this.groups = groups; 

     cachedJoin = doJoin().ToList(); 

     customers.CollectionChanged += (sender, args) => 
     { 
      cachedJoin = doJoin().ToList(); 
      if(CollectionChanged != null) 
       CollectionChanged.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); 
     }; 
     groups.CollectionChanged += (sender, args) => 
     { 
      cachedJoin = doJoin().ToList(); 
      if(CollectionChanged != null) 
       CollectionChanged.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); 
     }; 
    } 

    private IEnumerable<CustomerGroup> doJoin() 
    { 
     // Join code here 
     return customers.Join(groups, p => p.groupid, g => g.groupid, (p, g) => new CustomerGroup{ Name= p.uname, Groupname = g.groupname }); 
    } 

    public IEnumerator<CustomerGroup> GetEnumerator() 
    { 
     return cachedJoin.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

    public void Add(CustomerGroup item) 
    { 
     throw new NotSupportedException(); 
    } 

    public void Clear() 
    { 
     throw new NotSupportedException(); 
    } 

    public bool Contains(CustomerGroup item) 
    { 
     return cachedJoin.Contains(item); 
    } 

    public void CopyTo(CustomerGroup[] array, int arrayIndex) 
    { 
     throw new NotImplementedException(); 
    } 

    public bool Remove(CustomerGroup item) 
    { 
     throw new NotSupportedException(); 
    } 

    public int Count { get { return cachedJoin.Count(); } } 
    public bool IsReadOnly { get { return true; } } 
    public int IndexOf(CustomerGroup item) 
    { 
     return cachedJoin.IndexOf(item); 
    } 

    public void Insert(int index, CustomerGroup item) 
    { 
     throw new NotSupportedException(); 
    } 

    public void RemoveAt(int index) 
    { 
     throw new NotSupportedException(); 
    } 

    public CustomerGroup this[int index] 
    { 
     get { return cachedJoin[index]; } 
     set { throw new NotSupportedException(); } 
    } 

    public event NotifyCollectionChangedEventHandler CollectionChanged; 
} 
1

Возможно, я не понял ваш вопрос правильно, но это то, что вы ищете?

Создайте новый класс с именем CustomerGroup:

public class CustomerGroup 
{ 
    public string Name { get; set; } 
    public string Groupname { get; set; } 
} 

и создать соответствующий ObserverableCollection:

List<Customer> customers = new List<Customer>(); 
List<Group> groups = new List<Group>(); 

var result = new ObservableCollection<CustomerGroup>(
      customers.Select(
       x => new CustomerGroup{Name = x.uname, Groupname = groups.FirstOrDefault(g => g.groupid == x.groupid).groupname})); 
1

Сначала вы должны создать новый класс:

public class Result 

{ общественности string UserName {get; задавать; } public string Имя группы {get; задавать; }}

, а затем создать свой запрос

List<person> persons = new List<person>(); 
     List<group> groups = new List<group>(); 

     persons.Add(new person() { cid = 1, groupid = 2, uname = "Raj" }); 
     persons.Add(new person() { cid = 2, groupid = 3, uname = "Jeya" }); 

     groups.Add(new group() { groupid = 2, groupname = "Traveller" }); 
     groups.Add(new group() { groupid = 3, groupname = "Shopper" }); 

     ObservableCollection<Result> res= new ObservableCollection<Result>(
      persons.Join(groups, p => p.groupid, g => g.groupid, (p, g) => new Result{ UserName= p.uname, Groupname = g.groupname }) 
      ); 
Смежные вопросы