2011-09-28 16 views
3
userkey  keyboardkey  keypressed 
---------------------------------------- 
u1   kb1    A 
u1   kb1    B 
u1   kb2    C 
u2   kb1    A 
u2   kb1    B 
u3   kb1    A 
u3   kb1    B 
u3   kb1    D 
u4   kb1    E 

SQLクエリにlinqを書くと、一般的なキー入力のみを取得できます。linq to sqlクエリのヘルプ - 一般的な値

たとえば、ユーザーアカウントが(u1、u2、u3)でkeyboardkey = kb1の共通のキー入力があります。これはA、Bを含むalistとして出力を与えるでしょう。

ユーザーアカウントが(u1、u2、u3、u4)でkeyboardkey = kb1の共通キーが見つかると、何も返されません。

ありがとうございました。

答えて

3

次のようなものが動作するはずです。

これが必要です
var commonKeysPressed = db.keys 
          .Where(k => userKeyList.Contains(k.userkey) 
           && k.keyboardkey == someKeyboardkey) 
          .GroupBy(k => k.keypressed) 
          .Where(g => g.Select(x=> x.userkey).Distinct().Count() == userCount) 
          .Select(g => g.Key) 
          .ToList(); 

  1. keysをユーザーアカウントの配列であることを質問
  2. userKeyListでSQLテーブルであるためには、文字列配列、すなわち - あなたの例では(u1, u2, u3)
  3. someKeyboardkeyをいくつかのことキーボードのキー値(例: kb1userKeyList配列(userKeyList.Length
0

ないLINQの一行が、これは、私が思い付くことが最高です:

private List<String> GetCommonKeys(List<a> input, string[] users, string[] keyboardkeys) 
{ 
    var result = input.Where(c => users.Contains(c.userkey) && keyboardkeys.Contains(c.keyboardkey)).GroupBy (c => c.userkey); 
    var returnList = result.First().Select(c => c.keypressed); 
    foreach (var ls in result) 
    { 
     returnList = returnList.Intersect(ls.Select(t => t.keypressed)); 
    } 
    return returnList.ToList(); 
} 

struct a { 
    public String userkey; 
    public String keyboardkey; 
    public String keypressed; 
} 

編集:拡張機能としてこのように使用

public static class myExtensions 
{ 
    public static IEnumerable<TSelectType> SelectCommon<TSourceType, TSelectType>(this IEnumerable<IGrouping<TSelectType, TSourceType>> source, Func<TSourceType, TSelectType> action) 
    { 
     var firstResult = source.FirstOrDefault(); 
     if(firstResult == null) 
      return new List<TSelectType>(); 

     var returnCollection = firstResult.Select(action); 

     foreach(var ls in source) 
      returnCollection = returnCollection.Intersect(ls.Select(action)); 

     return returnCollection; 
    } 
} 

var res = lst.Where(c => new[] {"u1", "u2", "u3"}.Contains(c.userkey) && c.keyboardkey == "kb1").GroupBy (c => c.userkey).SelectCommon(c => c.keypressed); 
1

  • userCountユーザー数これは私の作品:

    var users = new [] { "u1", "u2", "u3", }; 
    
    var common = users 
        .GroupJoin(
         values.Where(v => v.keyboardkey == "kb1"), 
         u => u, 
         v => v.userkey, 
         (u, vs) => vs.Select(v => v.keypressed)) 
        .Aggregate(
         (zs, z) => zs.Intersect(z)); 
    

    私はMySQLデータベースにLINQPadでこれをテストし、それがうまく働きました。