2

このサンプルデータを考えてみましょう。

field1  field2  
1       100  
2       100  
3       101  
4       102  
5       102  
6       103   

の値が1回だけ発生するレコードのみを選択したいfield2。上記からの望ましい戻りデータの例は次のとおりです。

field1  field2  
3       101  
6       103   

これはLINQtoSQLでどのように行われますか?

---編集-------
みなさん、こんにちは。ご回答ありがとうございます。質問の根源を正しく理解するために、意図的に簡略化されたデータを提供しました。これらの回答はすべて、私の例のデータに基づいて望ましい結果を返すと思います。そのようにすべての回答にマークを付けます。

ただし、実際のデータシナリオでは、あなたの回答から学んだことを使用して、次のようなものがあります。

var RefinedSource =  from a in dSource
                     group a by a.AssetID into g
                     where g.Count() == 1
                     select new
                     {
                          AssetID = g.Key,
                          AssetType = g.Min(a => a.AssetType),
                          IPInfo = AppUtility.GetIPInfo(g.Key),
                          Hostname = AppUtility.GetServerName(g.Key),
                          DeviceID = g.Min(a => a.DeviceID).ToString(),
                          Environment = AppUtility.GetSolutionAndEnvironmentNames(g.Key),
                          Manufacturer = g.Min(a => a.Manufacturer),
                          MakeModel = g.Min(a => a.MakeModel),
                          Location = g.Min(a => a.Location),
                          count = g.Count()
                     };

だから私はすべての.min()呼び出しについて心配しています...私はこれらがグループ化のために必要であると推測しましたか?誰かがこれらが必要な理由を説明できますか?私の簡単な例の場合、それらが問題になることはありませんが、実際のデータでは、必要なすべてのフィールドデータを含めることができるようにするためにmin()を複数回呼び出しています...これはそうではないようです良い。

グループ化により、必要な条件(重複する値を識別するためにカウントされる)をテストできますが、このような条件をより直接的に使用して、実際の基になるデータ行に直接アクセスするにはどうすればよいですか?

たとえば、上記で提供した例を見ると、元の「from a in dSource」部分のa.FieldNameを使用できるようにしたいと思いますが、「groupby」を導入した後はアクセスできません。 ?

繰り返しになりますが、情報に感謝します。回答としてマークを付けますが、min()(またはmaxなど)のすべての呼び出しの必要性を誰かが説明できれば、それが私の実際のデータ、これはまだ私が行くべき方法ですか?

4

3 に答える 3

1
from r in tables
  group r.field2 by r.field1 into grp
  where grp.Count() == 1
  select new {grp.First(), grp.Key}

これが1つのSQL呼び出しを行うことを再確認します。これはFirst非常に一般的に使用される Linq メソッドであり、特定のケースで同じように優れたものが数十ある場合は、おなじみのものを優先する必要があります。複数の SQL 呼び出しが発生した場合 (これもまた驚きです)、の代わりにMax()orを試してください。Min()First()

于 2012-08-25T21:48:00.337 に答える
1

これを SQL で行う方法を次に示します (SQL を使用した方が速い場合もあります)。

 SELECT max(field1), field2
 FROM table
 GROUP BY field2
 HAVING count(field2) = 1

SQL Server でウィンドウ関数を使用する例
(注意: OVER 句が where にある必要があるかもしれないので、今はテストできません):

 SELECT COUNT() OVER(PARTITION BY field2) AS [field2Count], *
 FROM table
 WHERE [field2Count] = 1 
于 2012-08-25T21:43:48.403 に答える
0

あなたLINQは簡単に行うことができます:

var groups = list.GroupBy(r => r.Value).Where(grp => grp.Count() == 1);

foreach(var gr in groups){
   var field1 = gr.Key;      // KEY: is your FIELD1
   var field2 = gr.Value;    // VALUE: is your FIELD2
}
于 2012-08-25T21:52:10.080 に答える