2016-12-16 8 views
1

저는 문서 데이터베이스를 배우고 있으며 Visual Studio에서 Marten/Linq를 사용하고 있습니다. 데이터베이스가 Postgres/PGAdmin을 통해 실행 중입니다. 내 데이터베이스는 축구 (미국이 아닌) 리그, 팀, 선수 및 관리자입니다. 여러 매개 변수를 기반으로 쿼리를 작성하려고합니다. 나는 단수의 매개 변수를 꽤 잘 가지고있다.Visual Studio에서 Marten과 Linq를 사용하여 여러 매개 변수 쿼리

List<Player> englishPlayers = finalDb.Query<Player>().Where(x => x.Nationality.Contains("English")).ToList(); 

이 쿼리는 문서 데이터베이스에서 국적이 "영어"로 설정된 모든 플레이어의 목록을 만듭니다.

플레이어는 국적 "필드"가있는 내 클래스/테이블입니다. 내가 뭘 하려는지 여러 매개 변수를 기반으로 쿼리입니다. 예를 들어, int 또는 bool 인 여러 "필드"가 있습니다. 예를 들어, 생애와 함께 특정 국적의 모든 플레이어에게 목표> 100을 표시하는 쿼리를 작성하려면 어떻게해야합니까?

나는 약 1 시간 동안 구글을 검색해 보았고, 제안 된 유사한 질문을 읽었지만, 대부분의 질문은 마틴이 사용되는 것을 설명하지 않는다.

나는 예를 들어, 그들을 결합 먼저 개별 쿼리하여 분해 및 시도했다 :

Player m4 = finalDb.Query<Player>().SelectMany(e => e.lifetimeGoals 
       .Where(p => e.lifetimeGoals >= 0)); 

그러나,이에 대한 정의를 포함하지 않는

지능라는 오류가 발생합니다 where 및 no extension method '여기서' 'int'유형의 첫 번째 인수를 수락합니다.

이 용어에 대한 나의 용어는 약간이지만 희망 사항은 지침을 찾을만큼 명확합니다. 플레이어에 대한

클래스 : 당신은 정수에 .Where()을 사용할 수 없습니다

static void Main(string[] args) 
    { 

     string connectionString = ConfigurationManager.ConnectionStrings 
     ["FinalProjectDB"].ConnectionString; 
     IDocumentStore store = DocumentStore.For(connectionString); 

     using (var finalDb = store.OpenSession()) 
     { 
     Player m4 = finalDb.Query<Player>().SelectMany(p => p.lifetimeGoals) 
        .Where(p => p.lifetimeGoals >= 0 && p.myString.Equals("valueToCheck")); 

Console.ReadLine(); 
} 

답변

1

class Player 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public string Team { get; set; } 
    public string prefPosition { get; set; } 
    public string Nationality { get; set; } 
    public int yearsAtCurrentClub { get; set; } 
    public int lifetimeGoals { get; set; } 
    public int domesticTitles { get; set; } 
    public int europeanTitles { get; set; } 
}//Class Player 

메인 클래스입니다. 대신 다음과 같이 사용 :

Player m4 = finalDb.Query<Player>().SelectMany(e => e.lifetimeGoals) 
      .Where(p => p.lifetimeGoals >= 0); 

위의 질의는 의도 된 쿼리와 함께 작동하도록 Where 절을 허용 SelectMany의 끝에 대괄호가 있습니다.

SelectMany 끝에 대괄호를 추가하기 때문에 쿼리 끝에 추가 대괄호가 필요하지 않습니다.

편집 : 당신은 단순히 에 대한 &&를 사용하거나이 또는에 대한 ||을 사용할 수 있습니다 .Where()

Player m4 = finalDb.Query<Player>().SelectMany(e => e.lifetimeGoals) 
      .Where(p => p.lifetimeGoals >= 0 && p.myString.Equals("valueToCheck")); 

에 다른 절을 추가 할 수 있습니다.

두 번째 편집 : 나는 왜 .SelectMany()을 사용하는지 알지 못합니다.이 같은 쿼리를 사용할 수 있어야합니다 :

Player m4 = finalDb.Query<Player>().Where(p => p.lifetimeGoals >= 0 && p.myString.Equals("valueToCheck")).FirstOrDefault(); 

아니면 플레이어의 목록을 할 때 .ToList()를 사용합니다.

List<Player> players = finalDb.Query<Player>().Where(p => p.lifetimeGoals >= 0 && p.myString.Equals("valueToCheck")).ToList(); 
+0

큰, 좋아. 감사. 동일한 문에서 문자열 검사와 int 검사를 결합하는 것은 어떻습니까? 나는 당신의 응답을 기반으로 지능 검사를 결합하는 방법을 알아 냈하지만이 같은 쿼리 내부 문자열에 대한 검사를 통합 할 때 그것은 나에게 말한다 한 –

+0

죄송합니다, 그것은 나를 내 다른 게시물을 편집 할 수없는 이유 확실하지 오류가 ToList '없이 확장 메서드'첫 번째 의견에 대한 내 편집을 확인 –

+0

부울 '' '의 첫 번째 인수 유형을 받아들이는'ToList " '부울이'에 대한 정의를 포함하지 않는"입니다. 어떻게 당신은 ('.ToList를 사용합니까)'명세서에? – RandomStranger