2014-09-05 3 views
1

데이터베이스에 두 개의 테이블이 있습니다. 티켓 및 티켓 번호. Linq에게이 함수에 전달 된 숫자와 일치하는 숫자를 가진 티켓의 수를 계산하고 싶습니다. 얼마나 많은 숫자가 일치해야하는지 모르기 때문에, Linq는 동적이어야합니다 ... 내 이해에.일치하는 숫자를 계산하는 동적 Linq 작성 방법

가 이제 데이터베이스에 3 티켓은 내가 숫자 3과 4

함수가 2를 반환해야합니다이 경우
(1) 1 2 3 4 
(2) 1 3 4 6 7 
(3) 1 2 3 

을 가지고 모든 사람을 계산하려면, 예를 들어

public int CountPartialMatchingTicket(IList<int> numbers) 
{ 
    // where's the code? =_=; 
} 

말, 티켓 (1)과 (2)는 일치하는 번호를 가지고 있기 때문입니다. 나는 동적 사용한 적이

Ticket: 
TicketId, Name, AddDateTime 

TicketNumbers: 
Id, TicketId, Number 

: 다른 경우 1, 2, 3 일치하도록 요구한다면, 다시 우리가 여기

2를 반환해야처럼 데이터베이스에있는 두 테이블을 보면 무엇 Linq 전에, 그래서 경우에 대비해서 이것이 내 CS 파일의 맨 위에있는 것이다. 하지만

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using LottoGen.Models; 
using System.Linq.Dynamic; 

것부터 먼저, 난 내가 숫자의 고정 금액에 대한 Linq에 라인을 작성해야 방법을 모르겠어요. 나는 SQL이 다음과 같을 것이라고 생각한다.

SELECT  TicketId, COUNT(0) AS Expr1 
FROM   TicketNumber 
WHERE   (Number = 3) OR (Number = 4) 
GROUP BY  TicketId 

그러나 이것은 내가 원하는 것도 아니다. 위 쿼리는 나에게 3 또는 4가있는 티켓을 가져다 줄 것입니다.하지만 두 개의 티켓이 모두 필요합니다. 그리고 그것은 어떻게 든 하나의 카운트를 반환하기 위해 중첩되어야한다고 생각합니다. 그 기능을 완성하기 위해 상상력을 사용해야한다면 다음과 같이 될 것입니다.

public int CountPartialMatchingTicket(IList<int> numbers) 
{ 
    string query = ""; 
    foreach(int number in numbers) { 
     query += "Number = " + number.ToString() + " AND "; 
    } 
    // I know.. there is a trailing AND.. lazy 
    int count = DbContext.TicketNumbers.Where(query).Count(); 
    return count; 
} 

오 잠깐. 거기에 동적 Linq가 ... 위의 내가 PHP에서 할 것이라고 뭔가 그 쿼리 문을 분명히 아무것도 유용하지 않습니다 찾고 있습니다. 나는 무엇을하고 있는가? :(

하루의 끝에서

, 나는 출력이처럼 보이는 웹 페이지에 작은 테이블을 원하는

Ticket    Matching Tickets 
----------------------------------- 
3 4        2 

삼위 일체가 도움이

답변

2
public int CountPartialMatchingTicket(IList<int> numbers) 
{ 
    var arr = numbers.ToArray(); 
    int count = DbContext.Tickets 
      .Count(tk=>arr.All(n=> tk.TicketNumbers.Any(tn=>tn.Number== n)); 
    return count; 
} 

UPDATE를 :.! "당신이 만약 괜찮 으면,이 쿼리를 특정 AddDateTime (하루 종일)에서 만들어진 티켓으로 어떻게 제한할까요? "

Count() 메서드 호출 내의 부분은 WHERE 조건이므로 그냥 tha t :

DateTime targetDate = ......; 
    DateTime tooLate = targetDate.AddDay(1); 

    int count = DbContext.Tickets 
      .Count(tk=> 
         targetDate < tk.AddDateTime && tk.AddDateTime < tooLate 
         && arr.All(n=> tk.TicketNumbers.Any(tn=>tn.Number== n)); 
+0

을 그것 때문에 지금 응용 프로그램에서 이상한 행동을하고 있습니다. 이 사실을 조금 더 이해하면 다시 연락해야 할 것입니다. –

+0

답변으로 표시. 고맙습니다! 괜찮 으면이 쿼리를 특정 AddDateTime (하루 종일)에서 만들어진 티켓으로 어떻게 제한합니까? –

+0

답변이 업데이트되었습니다. –

1

이 제임스 쿠란의 대답과 비슷하지만 조금 단순하고 간단한 IN-기반 쿼리 생성한다 : 나는하지만,이 트릭을하고 있다고 생각한다

// count all tickets... 
return DbContext.Tickets.Count(
    // where any of their ticket numbers 
    tk => tk.TicketNumbers.Any(
     // are contained in our list of numbers 
     tn => numbers.Contains(tn.Number))) 
+0

IList가 데이터베이스 쿼리와 함께 사용할 수 있습니까? 배열이되어야한다고 생각했습니다. –

+0

@JamesCurran : 사용중인 EF 버전에 따라 달라질 수 있습니다. 6에서, 내 테스트는 IEnumerable에서이 작업을 수행 할 수 있음을 보여주었습니다. – StriplingWarrior

+0

확인. 나는 Linq2Sql에 익숙하다. 그러나 또 다른 문제가 있습니다.'Any' 내부의'tn '은 TicketNumber 객체가 될 것입니다. 비교를 위해'tn.Number' 속성을 가져와야합니다. –