所以这就是我想要做的事情:
select subscriber, count(subscriber)
from subscribers
where subscriber = subscribedTo
group by subscriber
having count(subscriber) > 1
在SQL中足够简单。我无法弄清楚如何在LINQ中编写它。有谁知道如何解决这个问题?
该表只有三个列,ID,订阅者和subscribedTo。我试图找到订阅者== subscribedTo的重复行。
答案 0 :(得分:4)
你可以试试这个
var duplicatedSubscribers=
from s in subscribers
where s.subscribedTo == s.subscriber
group s by s.subscriber into g
where g.Count() > 1
select new { subscriber = g.Key, Count = g.Count() };
您可能需要查看http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx
中的LINQ示例答案 1 :(得分:0)
请参阅我的回答:
public class MyClass
{
public int ID
{
get; set;
}
public string Subscriber
{
get; set;
}
public string SubscriberTo
{
get; set;
}
}
枚举我的班级列表的代码是:
var myList = new List<MyClass>();
var douplicateRows = from element in myList
where
string.Compare(element.Subscriber, element.SubscriberTo,
StringComparison.InvariantCultureIgnoreCase) == 0
group element by element.Subscriber
into mygroup
where mygroup.Count() > 1
select new
{
Subscriber = mygroup.Key,
Elements= mygroup
};
希望得到这个帮助。
答案 2 :(得分:0)
您可以使用查询语法,也可以使用扩展方法。我将在两者中提供示例。您可以通常移动WHERE过滤。我选择将它保持分开,以便您可以稍微使用代码并查看分组的差异。在Linq To SQL中,如果将WHERE条件移动到具有分组的表达式,它将更好地转换为SQL。
您的实体可能看起来像这样。
public class CustomRowType
{
public int ID { get; set;}
public string Subscriber { get; set; }
public int SubscribedTo { get; set; }
}
首先,使用扩展方法的示例。这是我通常喜欢这样做的方式。
public void GroupTest()
{
// Create some data to work with.
List<CustomRowType> testData = new List<CustomRowType>();
testData.Add(new CustomRowType() { ID = 1, Subscriber = "Subscriber 1", SubscribedTo = 40 });
testData.Add(new CustomRowType() { ID = 2, Subscriber = "Subscriber 2", SubscribedTo = 1 });
testData.Add(new CustomRowType() { ID = 3, Subscriber = "Subscriber 3", SubscribedTo = 2 });
testData.Add(new CustomRowType() { ID = 4, Subscriber = "Subscriber 4", SubscribedTo = 2 });
// Group data (equivalent to GROUP BY clause)
var grp = testData.GroupBy(
row => row.SubscribedTo,
(key, row) => new
{
Data = row,
// Here is the aggregate value
KeyCount = testData.Count(i => i.SubscribedTo == key)
}
);
var output = grp
// Filter group data (equivilent to HAVING clause)
.Where(g => g.KeyCount > 1) // Remove this line to see all aggregate data.
// Flatten group data (equivalent to SELECT clause)
.SelectMany(g => g.Data
.Select(d => d.ID.ToString() + "(" + d.Subscriber + ") -> " + d.SubscribedTo.ToString()+" with (" + g.KeyCount.ToString() + ") total subscriptions" ))
.ToList();
listBox1.Items.Clear();
output.ForEach(s => listBox1.Items.Add(s));
}
接下来是查询语法示例。
public void GroupTest()
{
// Create some data to work with.
List<CustomRowType> testData = new List<CustomRowType>();
testData.Add(new CustomRowType() { ID = 1, Subscriber = "Subscriber 1", SubscribedTo = 40 });
testData.Add(new CustomRowType() { ID = 2, Subscriber = "Subscriber 2", SubscribedTo = 1 });
testData.Add(new CustomRowType() { ID = 3, Subscriber = "Subscriber 3", SubscribedTo = 2 });
testData.Add(new CustomRowType() { ID = 4, Subscriber = "Subscriber 4", SubscribedTo = 2 });
// Using query syntax
var grp = (
from d in testData
group d by d.SubscribedTo into g
select g
);
var output = grp
// Filter
.Where(g => g.Count() > 1)
// Flatten group data (equivalent to SELECT clause)
.SelectMany(g => g
.Select(d => d.ID.ToString() + "(" + d.Subscriber + ") -> " + d.SubscribedTo.ToString()+" with (" + g.Key.ToString() + ") total subscriptions" ))
.ToList();
listBox1.Items.Clear();
output.ForEach(s => listBox1.Items.Add(s));
}