2011-01-20 7 views
4

리터럴 값을 쿼리에 추가해야합니다. 내 시도Linq Union : 리터럴 값을 쿼리에 추가하는 방법?

위의 예에서
var aa = new List<long>(); 
aa.Add(0); 
var a = Products.Select(p => p.sku).Distinct().Union(aa); 

a.ToList().Dump(); // LinqPad's way of showing the values 

, 나는 오류가 발생 : 내가 엔티티 프레임 워크 4를 사용하고있는 경우

"Local sequence cannot be used in LINQ to SQL implementation 
of query operators except the Contains() operator." 

예를 들어, 나는 연방 문에 무엇을 추가 할 수 있습니다에 항상 포함 " 시드 "신분증?

나는 다음과 같은 SQL 코드를 생성하려고 : 그래서 다음으로 가장 높은 값이 존재하지 않는 모든 값을 찾을 수 있습니다 나중에 내가 자체에 대한 목록을 join

select distinct ID 
from product 
union 
select 0 as ID 

(가장 낮은 발견 세트에서 사용 가능한 ID).

편집 : 원래 Linq는 쿼리는 다음으로 가장 높은이 존재하지 않는 경우 다음 SKU를 선택하고,이 코드는 두 개의 SKU 하나에 의해 상쇄 세트 생성 가능한 가장 낮은 ID

var skuQuery = Context.Products 
       .Where(p => p.sku > skuSeedStart && 
          p.sku < skuSeedEnd) 
       .Select(p => p.sku).Distinct(); 

var lowestSkuAvailableList = 
    (from p1 in skuQuery 
    from p2 in skuQuery.Where(a => a == p1 + 1).DefaultIfEmpty() 
    where p2 == 0 // zero is default for long where it would be null 
    select p1).ToList(); 
var Answer = (lowestSkuAvailableList.Count == 0 
       ? skuSeedStart : 
       lowestSkuAvailableList.Min()) + 1; 

을 찾을 수 있습니다. 그 다음에 최소값 (가장 높은 SKU가 다음으로 높은 값을 사용할 수있는 값)을 선택합니다.

이 작업을하려면 시드가 함께 결합 된 세트에 있어야합니다.

답변

4

당신이 필요로하는 것이 LINQ-to-SQL 쿼리이고, 그 위에 로컬 조작이 포함되어 있으면 문제가 완전히 LINQ-SQL 쿼리로 바뀌고 있다는 것입니다.

이 솔루션은 (,, IEnumerable<T>보고 확장 방법 해상도를 변경하지 IQueryable<T> 즉) 쿼리를 처리하는 LINQ - 투 - 객체 후 사용할 컴파일러에게하는 것입니다. 이 작업을 수행하는 가장 쉬운 방법은과 같이, 쿼리의 말에 AsEnumerable()을 압정하는 것입니다 (앞)까지

var aa = new List<long>(); 
aa.Add(0); 
var a = Products.Select(p => p.sku).Distinct().AsEnumerable().Union(aa); 

a.ToList().Dump(); // LinqPad's way of showing the values 
+0

코드는 궁극적으로 "씨"못지 않게 사용할 수있는 가장 낮은 ID를 가져옵니다. 현재, 기존 ID에서 시작하여 가장 낮은 ID를 얻습니다. 따라서 "0"이 쿼리의 일부가되어야하는 이유는 무엇입니까? SQL에서는 '제품 조합에서 고유 ID를 선택하십시오. 0으로 ID 선택'을 수행합니다 (별개의 값을 선택하도록 명확하게 추가했습니다) –

+0

@Dr. Zim : LINQ-to-SQL 쿼리에 실제 리터럴 값을 도입 할 수 있다고 생각하지 않습니다.검색어를 더 큰 맥락으로 게시 할 수 있다면 고양이를 다듬는 다른 방법을 찾을 수는 있지만 일반적으로 불가능합니다. –

+0

원본 Linq 쿼리 추가 : –

1

: 정확하게 당신이 묻는 질문에 대답하지만, 다른 방법으로 문제를 해결하지.

이 방법에 대해 :

var a = Products.Select(p => p.sku).Distinct().ToList(); 

a.Add(0); 

a.Dump(); // LinqPad's way of showing the values 
+0

원래 전체 Linq 쿼리를 가져올 수없는 이유를 더 잘 설명 할 원래 Linq 쿼리를 추가했습니다. –

+0

아, 네, 알겠습니다. –

0

당신은 상수 값을 저장하기위한 데이터베이스 테이블을 작성하고 UNION 연산자이 테이블에서 쿼리를 전달해야합니다.

예를 들어 하나의 레코드 ("SKU", 0) 만있는 "이름"과 "값"필드가있는 "기본값"테이블을 상상해 봅시다.

그럼 당신은 다음과 같은 표현식을 다시 작성할 수 있습니다 :

 var zero = context.Defaults.Where(_=>_.Name == "SKU").Select(_=>_.Value); 
     var result = context.Products.Select(p => p.sku).Distinct().Union(zero).ToList(); 
관련 문제