2017-12-21 1 views
3

EF6을 사용하여 Find(key1.a, key1.b) 메서드를 사용하여 복합 기본 키로 엔티티를 가져올 수 있습니다. 내가 EF 키으로 검색하는 두 가지 방법이 있습니다 이유를 알고 싶습니다, 또한EF 복합 키의 배열로 찾기

:

var keys = new [] {new {a = 1, b = 2}, new {a = 2, b = 3}, /*etc*/}; 
var entities = context.Items.Find(key1.a, key1.b, key2.a, key2.b, ..., keyN.a, keyN.b); 

UPD 즉, 수행하는 여러 개의 키에 대해 동일한 것이 가능 Find 및 LINQ의 Where, Single

+0

에 대한 확장 방법을 쓸 수 있습니다. DbSet .Find 메서드가 문서화되어 있으며 단일 엔터티 만 반환합니다 –

+0

@SirRufo : fixed, thanks. 나는 그때의 해결 방법을 알고 싶다. –

+0

일부 RDBM은 [이와 비슷한] 구문 (https://stackoverflow.com/a/8011075/314291)을 사용하여 복합 기본 키와 같은 튜플과 함께 'IN'을 허용합니다. 그러나 [너무 SqlServer] (https://connect.microsoft.com/SQLServer/feedback/details/299231/add-support-for-ansi-standard-rowvalue-constructors). '(KeyCol1 = Value1 AND KeyCol2 = Value2) OR (KeyCol1 = ..) '을 사용하여 쿼리를 분할해야합니다. – StuartLC

답변

1

documentation 여기에 꽤 분명하다 등 : 그건 불가능하다

  1. 여러 PK를 전달할 수 있다면 그것은 단지 쉽게 경우가 될 수
  2. 그것은 실제로 주어진 기본 키와 여러 단체가 존재하는 경우 예외를 throw 하나의 개체를 반환은

최고 값 하나 여러 번에 대해 동일한를 반복하여뿐만 아니라 당신이 하나 아무것도 할 수 있다면

context.Items.Where(x => keys.Any(y => y.a == x.a && y.b == x.b)) 
+0

Ok. 그 일을하는 또 다른 방법이 있습니까? 꽤 인기있는 유스 케이스라고 생각합니다 : 그러한 키 배열을 찾으십시오. –

+0

제 편집을 참조하십시오. 이것이 올바르게 SQL로 변환 될 수 있는지 100 % 확신 할 수 없습니다. 그렇지 않으면 예외가 발생합니다. 그렇게한다면, 여기로 돌아와서 다른 해결책을 찾아 보겠습니다. –

1

, 당신은 많은 그것을 할 수 있습니다 : 행동의 과정은 LINQ의 Where 사용하는 것입니다.

당신은 DbContext 클래스는 더 찾기 방법이없는이

public static class IDbSetExtensions 
{ 
    public static ICollection<T> FindMany(this IDbSet<T> @this, IEnumerable<object[]> keys) 
    { 
     return keys.Select(key => @this.Find(key)).ToList(); 
    } 
} 
+2

이것은 잠재적으로 많은 데이터베이스 히트를 초래할 것입니다. 주의해서 사용하십시오! –

관련 문제