我对LINQ非常陌生,我正在寻找一些指导我的项目的最佳途径。
我正在开发一个通过电子邮件或短信发送通知消息的应用程序。
我目前在我的SQL数据库中有3个表,我抓住了c#: -
var contacts = db.GetTable<Contact>();
var distributionLists = db.GetTable<DistributionList>();
var JunctionTable = db.GetTable<ContactsDistribution>();
用户可以从列表框控件中选择多个通讯组列表。我需要找到一种方法来为每个选定的项添加记录到列表/对象。获得最终数据后,我需要删除任何重复数据,因为联系人可以属于多个分发列表。
最后,列表中每个联系人只应该有一个条目,因为我不想多次向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对象,但我不确定这是否正确。
一旦我拥有所有条目..我可以删除重复项,但不确定我是否正在沿着这条路走下去?
有更好的方法吗?
答案 0 :(得分: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();
如果您需要从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();
答案 1 :(得分: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));