2016-12-04 3 views
1

I는 엔티티 프레임 워크를 통해 객체를 로딩하고, 나중에 그것을 사용하기를 지속하는 경우 - - 예를 들면 동등 필터 엔터티 프레임 워크는 다음과 같은 오류가 발생 값/값 조합은 MyType에 있습니다 (예 : .Where(x => x.Name == MyTypeMemoryInstance.Name)).Entity Framework 조건에서 메모리 개체 동등 비교를 간소화하는 방법은 무엇입니까? 이 후 쉽게 식별을 사용하여 해결 될 수</p> <blockquote> <p>Unable to create a constant value of type 'MyType'. Only primitive types or enumeration types are supported in this context.</p> </blockquote> <p>:

그러나 기본 형식을 제공 할 필요없이 동등 비교를 허용하는 대안이 있는지 궁금 해서요. .Where(x => x == MyTypeMemoryInstance)을 수행 할 수 있으며 여전히 메모리가 아닌 SQL에서 수행합니다.

개념적으로, C#의 일반적인 동등 비교를 재정의하는 것과 비슷한 특정 기본 유형 비교를 사용하여 LINQ-to-SQL 변환을 제공 할 수 있다면이를 해결할 수 있지만 if 이것은 실제로 가능합니다. 고맙습니다.

답변

1

나는 때문에 where 절에, 생각할 수있는 최저 그런 다음

public class MyType 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public Func<MyType, bool> GetQuery() 
    { 
     // or whatever equals you would like 
     return x => x.Name == this.Name && x.Id == this.Id; 
    } 
} 

예를 들어처럼 사용합니다 : - 예, 나는 메모리 비교에 대해 알고 있지만, 정말 대신 SQL 번역이 자동화 싶어

var first = ctx.MyTypes.First(); 
var listContainingLoadedThings = ctx.MyTypes.Where(first.GetQuery()).ToList(); 
0

문제는 Linq to Entities 쿼리가 SQL로 변환된다는 것입니다. Linq 공급자는 SQL에서 두 개체 인스턴스를 비교할 수 없습니다. 그래서 SQL에서와 마찬가지로 원시 타입으로 작업해야하기 때문에 예외가 발생합니다.

하나의 솔루션은 Linq에서 Entities, Linq, Objects로 전환하기 위해 AsEnumerable 확장 방법을 사용할 수 있습니다. 다음과 같이하면 :

var query=context.YourDbSet.AsEnumerable().Where(x => x== MyTypeMemoryInstance).... 

그러나이 솔루션을 사용할 때는주의해야합니다. 해당 테이블의 모든 행을 메모리로로드합니다. 또 다른 일부 솔루션은 다음 당신은 당신이 정말 그렇게 할 필요가있는 경우 인스턴스 비교를 적용 이후 첫 몇 가지 필터를 적용 할 수 이상의 조건이있는 경우 일 수 있습니다

var query=context.YourDbSet.Where(...).AsEnumerable().Where(x => x== MyTypeMemoryInstance).... 
+0

감사합니다 당신은 Func을이 것이 . 본질적으로 LINQ to SQL 공급자가 IComparer, 특성 등을 통해 (평등 비교를 위해 사용하고자하는 것을) 인식하고 동등한 비교 식을 확인할 때이를 사용할 수 있기를 바랍니다. – Alex

+0

나는 서버 수준에서 비교가 가능하지 않다는 것을 두려워한다. (하지만. 왜 두 개체의 다중 속성을 인스턴스를 비교하는 대신 비교할 수 없습니까? 지금까지는 처리 방법을 정의 할 수있는 것이 아직 존재하지 않는다는 것을 알고 있습니다./sql에서 비교할 개체 인스턴스를 변환합니다. – octavioccl