【问题标题】:C# LINQ - Filter QueriesC# LINQ - 过滤查询
【发布时间】:2012-07-30 21:33:55
【问题描述】:

我是 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 对象,但我不确定这样做是否正确。

一旦我拥有所有条目.. 然后我可以删除重复项,但不确定我是否走在正确的道路上?

有更好的方法吗?

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    我不完全了解您想要做什么,但这可能会对您有所帮助:

    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();
    

    如果您需要从InitialList 中删除重复项,您可以使用Distinct 方法:

    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();
    

    【讨论】:

    • 我无法使用 ListBox1.SelectedItems.Select...“Select”属性不可用。我必须在 .Net 3.5 中构建我的项目 :-(
    • 这样就完美了。
    • 这也很棒,非常感谢。
    【解决方案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));
    

    【讨论】:

    • 我无法使用 ListBox1.SelectedItems.Select...“Select”属性不可用。我必须在 .Net 3.5 中构建我的项目 :-(
    • @Derek Select 是一种方法而不是属性,它从 .NET 3.0 版本开始提供
    • 'System.Windows.Forms.Listbox.SelectedObjectCollection' 不包含“Select”的定义,并且没有扩展方法“Select”接受“System.Windows.Forms.Listbox”类型的第一个参数。 SelectedObjectCollection'
    • Selecteditems 有点烦人,你需要在 ToString 之前强制转换为对象。我编辑我的答案。
    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多