Hihi,我有一张包含以下数据的表格:
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,因为它们被视为一对。
请告知我如何实现这一目标?谢谢!
答案 0 :(得分:3)
我建议不要使用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);
答案 1 :(得分:1)
我不确定我完全理解这个问题,但这是我的出价:
var results = from r in MyTable
where r.SampleID == 3 || r.SampleKey == 3
select r;
var nResults = results.Count();
虽然,老实说,我不知道为什么名为ID的专栏实际上不是ID。没关系,我想我现在就知道了。您将两列链接为唯一键(或者我希望如此)。
-
修改强>
Nappy实际上有一个great solution,我不确定为什么删除它。用3抓住所有行然后重新加入它们是完美的。
答案 2 :(得分:1)
在非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);
即按ID分组,找到匹配的组,然后将这些组平移回行。我不知道类似SQL的语法,抱歉。
答案 3 :(得分:1)
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;
答案 4 :(得分:0)
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;
答案 5 :(得分:0)
你可能会这样做:
var result = data.Where(
y => data.Where(x => x.SampleKey == 3)
.Select(x => x.SampleID)
.Contains(y.SampleID));