2

私は LINQ に非常に慣れていないので、自分のプロジェクトを実行するための最適なルートについてのガイダンスを探しています。

電子メールまたは SMS 経由で通知メッセージを送信するアプリケーションを開発しています。

現在、SQL データベースに 3 つのテーブルがあり、C# で取得しています:-

        var contacts = db.GetTable<Contact>();
        var distributionLists = db.GetTable<DistributionList>();
        var JunctionTable = db.GetTable<ContactsDistribution>();

ユーザーは、リストボックス コントロールから複数の配布リストを選択できます。選択した各アイテムのリスト/オブジェクトにレコードを追加する方法を見つける必要があります。連絡先は複数の配布リストに属する可能性があるため、最終データを取得したら、重複を削除する必要があります。

最後に、同じ通知を 1 人の連絡先に複数回送信したくないため、リスト内の連絡先ごとに 1 つのエントリのみが必要です。

私が持っているLINQクエリは以下の通りです:-

foreach (var li in listBox1.SelectedItems)
        {
            string text = "";
            text += li.ToString();


            var InitialList = (from j in JunctionTable
                  where j.DistributionName.Equals(text)
                  join c in contacts
                  on j.ContactID equals c.ContactID
                  select new { c.ContactID,  j.DistributionName }).ToList();

        }

リストボックスで選択したアイテムごとに、このクエリに追加し続ける必要があります。List オブジェクトを使用してみましたが、これが正しい方法かどうかはわかりません。

すべてのエントリを取得したら..重複を削除できますが、これで正しい道を進んでいるかどうかわかりません??

より良いアプローチはありますか?

4

2 に答える 2

4

あなたが何をしたいのか正確にはわかりませんが、これは少し役立つかもしれません:

var listBoxItems = listBox1.SelectedItems.Select(x => x.ToString());

または:

var listBoxItems = from li in listBox1.SelectedItems
                   select new { x.ToString() };

var InitialList = (from j in JunctionTable
                   where listBoxItems.Contains(j.DistributionName)
                   join c in contacts on j.ContactID equals c.ContactID
                   select new { c.ContactID,  j.DistributionName }).ToList();

重複を削除する必要がある場合は、 DistinctメソッドInitialListを使用できます。

var InitialList = (from j in JunctionTable
                   where listBoxItems.Contains(j.DistributionName)
                   join c in contacts on j.ContactID equals c.ContactID
                   select new { c.ContactID,  j.DistributionName }).Distinct().ToList();
于 2012-07-30T13:18:19.617 に答える
2

コードを細かく分割することを忘れないでください!

それが十分に速い場合、そして読みやすさのために、私はこの解決策を選びます:

var contacts = db.GetTable<Contact>();
var distributionLists = db.GetTable<DistributionList>();
var JunctionTable = db.GetTable<ContactsDistribution>();

var distributionNames = listBox1.SelectedItems
                          .Cast<object>()
                          .Select(t => t.ToString());

var junctions = JunctionTable.Where(j => distributionNames.Contains(j.DistributionName));

var contactIds = junctions.Select(j => j.ContactID).Distinct();

var contacts = contacts.Where(c => contactIds.Contains(c.ContactID));
于 2012-07-30T13:20:24.727 に答える