0

このようなテーブルがあります。

id - int
tpc - string
dcid - int
other fields

この本当にユニークな一足tpcですdcidtpcこの時点で LQ または GR のいずれかになります。もっと増えるかもしれませんが、今のところ2つだけです。

そのため、LINQ を介してレコードのリストを取得しようとしています。同じ dcid を持つ 2 つのレコードがあり、1 つは LQ 用で、もう 1 つは GR 用です。

次のデータがあるとします。

1, GR, 1, ...
2, LQ, 1, ...
3, GR, 2, ...
4, GR, 3, ...
5, LQ, 3, ...

返されるリストは 1,2,4,5 です。
3 は、dcid 2 の LQ エントリがないため、リストに含まれません。

さまざまなクエリを試しましたが、tpc で 2 つの dcid をチェックするロジックに苦労しています。

4

2 に答える 2

3
var required = new List<string> { "LQ", "GR" };
var query = data
    .GroupBy(x => x.dcid)
    .Where(g => g
        .Select(x => x.tpc)
        .Intersect(required)
        .Count() == required.Count)
    .Select(g => g.Key);
于 2013-04-17T05:32:13.680 に答える
0

したがって、私が正しく理解していれば、使用可能な TPC タイプごとにレコードが存在する ID を返す必要があります。あなたの例では 2 つの TPC タイプがありますが、それ以上のタイプがある可能性があります。

このようなものは動作します:

var tpcs = new List<string>();

var filtered = records.GroupBy(record =>
{
  //Keep a track of the available TPC types
  if (!tpcs.Contains(record.TPC))
  {
    tpcs.Add(record.TPC);
  }

  return record.DCID;

})
.Where(group =>
{
  //Get the TPCs for the group
  var groupTpcs = group.Select(record => record.TPC);

  //Only return groups that have records for all the TPC types
  return groupTpcs.Intersect(tpcs).Count() == tpcs.Count;       
});

//Print groups
foreach (var group in filtered)
{
  Console.WriteLine(group.Key);
  foreach (var record in group)
  {
    Console.WriteLine("\tID = {0}, TPC = {1}, DCID = {2}", record.ID, record.TPC, record.DCID);
  }
}

結果:

1
    ID = 1, TPC = GR, DCID = 1
    ID = 2, TPC = LQ, DCID = 1
3
    ID = 4, TPC = GR, DCID = 3
    ID = 5, TPC = LQ, DCID = 3

ID だけが必要な場合は、LINQ ステートメントの最後に SelectMany を追加します。

.SelectMany(group =>
{
  //Return a list of IDs for each record in the group
  return group.Select(record => record.ID);
});

ただし、このアプローチをお勧めするかどうかはわかりません。

于 2013-04-17T05:29:57.843 に答える