带有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,因为它们被视为一对。

请告诉我如何才能做到这一点?可以谢谢!

带有Count和Where条件的LinQ

出于性能原因,我建议不使用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));