1

EntityFrameworkを使用するSilverlightMVVMプロジェクトにCustomerとGroupという名前の2つのObservableCollectionがあります。

この2つのObservableCollectionを結合し、Finalという名前の新しいObservableCollectionを生成する必要があります。参加は、条件の使用で構成されます。

1番目のObservableCollectionには次のフィールドがありました

cid, groupid uname
1    2       Raj
2    3       Jeya

2番目のObservableCollectionには次のフィールドがありました

groupid groupname
2     Traveler
3     Shopper

ファイナルテーブルは次のようになります

uname groupname
Raj    Traveler
Jeya    Shopper

とにかくそれを最終結果にする方法はありますか..?

4

3 に答える 3

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}));
于 2012-12-19T10:05:31.217 に答える
1

まず、新しいクラスを作成する必要があります。

  public class Result

{public string UserName {get; セットする; } public string Groupname {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 })
             );
于 2012-12-19T10:57:51.770 に答える
1

(他の回答で提案されているように)結合からObservableCollectionを作成するだけでは、コレクションは「監視可能」ではなくなります。つまり、元のコレクションへの変更は反映されません。変更を伝達するには、INotifyCollectionChangedを実装する新しいコレクションクラスを作成する必要があります。

次のコードでは、CollectionChanged with 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;
}
于 2012-12-19T13:01:38.350 に答える