2011-09-28 6 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 일부가 될 수 있습니다 키보드 키 값 (예 : kb1)
  4. userCount이 나를 위해 작동 userKeyList 배열 (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

의 사용자 수 :

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이 테스트하고 괜찮 았는데.