2010-12-23 2 views
0

기본 모델과 기본적인 DbContext가 작동합니다.모든 기록을 반환하는 방법 및 관련 기록이 존재하는지 여부

public class Customer { 
    public int CustomerId { get; set; } 
    public int Name { get; set; } 
    //... 
    public ICollection<Address> Addresses { get; set; } 
    public bool HasAddress { 
    get { 
     return Addresses.Count > 0; 
    } 
    } 
} 

public class Address { 
    public int AddressId { get; set; } 
    public string StreetLine1 { get; set; } 
    //.... 
    public Customer Customer { get; set; } 
} 

모든 고객을 반환하기 위해 내 DbContext를 쿼리하고 주소가 있는지 여부를 어떻게 확인할 수 있습니까?

고객은 여러 개의 주소를 가질 수 있으며 주소가 있는지 여부에 관심이있을 때 각 고객의 모든 주소를 반환하고 싶지 않습니다. 나는 context.Customers.Include(c => c.Addresses)을 사용하지만 각 고객마다 모든 주소를 반환합니다.

답변

3

모든 주소를 반환합니다. AFAIK 집계 연산을 LINQ-Entities 조건 자에서 사용할 수 없기 때문에 HasAddress 속성을 LINQ 조건 자에서 직접 사용할 수 있다고는 생각하지 않습니다. 모든 고객을 포함하여 익명 형식의 컬렉션을 반환합니다

var result = ctx.Customers.Select(x => new 
            { 
            Customer = x, 
            HasAddress = x.Addresses.Count() > 0 
            }).ToList(); 

을하고 있는지 그들은 적어도 하나 개의 주소를 가지고 :

그래서 당신은 이런 식으로 뭔가를해야 할 수도 있습니다.

()은 개수에 유의하십시오.이 값은 실제 집계 연산을 수행하며, .Count은 클라이언트 측 LINQ 연산입니다.

HTH. 다시 고객 객체에 익명 유형을 넣어하려는 경우

편집

, 당신은 쿼리를 구체화 한 후이 (예를 .Count()가 데이터베이스에서 수행 된 보장) 수행 할 수 있습니다

var result = ctx.Customers.Select(x => new 
             { 
             Customer = x, 
             HasAddress = x.Addresses.Count() > 0 
             }).ToList() 
             .Select(x => new Customer 
             { 
             // left to right copy.... 
             HasAddress = true 
             }).ToList(); 

정말 더러운 IMO이지만 작동합니다.

+0

감사합니다. 어쨌든 x.Addresses.Count()> 0을 Customer 객체의 HasAddress 속성에 투영하려고합니까? 내 모델을 깨끗하게 유지하고 추가 익명 형식은보기 모델과 비슷합니다. –

+0

'.Count' (no'()')를 사용하여 속성을 그대로 유지할 수 있지만, (예 : 조회가 실행 된 후) 순서에 대한 측 조작. 내가 언급 한대로 당신은 단지 그것을 술어에서 사용할 수 없을 것입니다. 그리고 네 - 다른 클래스/타입으로 프로젝트를 제출하십시오. – RPM1984

+0

Customer 객체에 다시 넣을 수있는 방법을 보여주는 편집을 추가했습니다. 그러나 그것은 상당히 더러워요. 나는 더 좋은 길을 모른다. – RPM1984

관련 문제