LinQ与Count和Where条件

时间:2011-05-03 15:42:07

标签: c# asp.net linq

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

请告知我如何实现这一目标?谢谢!

6 个答案:

答案 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));