带有Count和Where条件的LinQ
本文关键字:LinQ 条件 Where Count 带有 | 更新日期: 2023-09-27 17:54:20
嗨,我有一个包含以下数据的表:
SampleID | SampleKey | SampleData
1 | 1 | abc
1 | 2 | def
2 | 1 | xxx
2 | 3 | yyy
3 | 3 | zzz
3 | 4 | qqq
我想检索至少有一个SampleKey为3的所有行,这应该给我
2 | 1 | xxx
2 | 3 | yyy
3 | 3 | zzz
3 | 4 | qqq
应返回带有2和3的SampleID,因为它们被视为一对。
请告诉我如何才能做到这一点?可以谢谢!
出于性能原因,我建议不使用Contains
,而是使用内置的Join
方法。
var keys = source.Where(s => s.SampleKey == 3).Select(s => s.SampleID).Distinct();
var result = source.Join(keys, s => s.SampleID, k => k, (s, k) => s);
var idsToSelect = from x in MyTable where x.SampleKey == 3 select x.SampleID;
var results = from x in MyTable where idsToSelect.Contains(x.SampleID) select x;
我不确定我完全理解这个问题,但这是我的出价:
var results = from r in MyTable
where r.SampleID == 3 || r.SampleKey == 3
select r;
var nResults = results.Count();
虽然,我将是诚实的,我不知道为什么你的列名为ID实际上不是一个ID。没关系,我想我现在明白了。您将两个列作为唯一键连接(至少我希望如此)。
,
编辑
Nappy实际上有一个很好的解决方案,我不知道为什么他/她删除了它。抓取所有带3的行,然后重新连接它们,效果很好。在非sql类语法中,您可以使用
var groupsById = MyData.GroupBy(x => x.SampleId);
var groupsThatMatch = groupsById.Where(g => g.Any(x => x.SampleKey == 3));
var allRows = groupsThatMatch.SelectMany(g => g);
。e按ID分组,找到匹配的组,然后将它们平放回行。对不起,我不知道sql语法
DataTable dt = new System.Data.DataTable();
dt.Columns.Add("SampleID", typeof(Int32));
dt.Columns.Add("SampleKey", typeof(Int32));
dt.Columns.Add("SampleData", typeof(string));
dt.Rows.Add(1, 1, "abc");
dt.Rows.Add(1, 2, "def");
dt.Rows.Add(2, 1, "xxx");
dt.Rows.Add(2, 3, "yyy");
dt.Rows.Add(3, 3, "zzz");
dt.Rows.Add(3, 4, "qqq");
var result = from DataRow myRow in dt.Rows
where (int)myRow["SampleID"] == 3 || (int)myRow["SampleKey"] == 3
select myRow;
你可以这样做:
var result = data.Where(
y => data.Where(x => x.SampleKey == 3)
.Select(x => x.SampleID)
.Contains(y.SampleID));