2009-11-11 8 views
5

저는 얼마 동안 LINQ를 사용하여 POCO 개체를 쿼리했지만 LINQ to SQL을 아직 시도하지 않았습니다. 나는 LINQ to SQL 쿼리가 어떻게 든 상응하는 SQL 쿼리로 변환된다고 가정하고, 주어진 LINQ to SQL 쿼리가 작성되거나 작성되어야하는 방식에 영향을 주는지 궁금합니다.LINQ와 개체의 차이점과 LINQ to SQL 쿼리

LINQ to Objects와 LINQ to SQL 사이에 쿼리를 작성하는 방법에 영향을주는 중요한 차이점이 있습니까?

+0

도 http://stackoverflow.com/questions/2388022/case-insensitive-string-compare-with-linq-to-sql-and-linq-to-objects –

답변

3

가장 큰 차이점은 LINQ to SQL 쿼리가 SQL로 변환된다는 것입니다. 즉, 실제로 변환 할 수 없거나 약간의 의미가 다른 코드를 작성할 수 있다는 것을 의미합니다. 실행시에만 해당 코드를 찾을 수 있습니다. 예를 들어

:

var query = from person in people 
      where person.Age == person.GetHashCode() 
      select person; 

벌금을 컴파일하지만, SQL에 LINQ는 GetHashCode()으로 무엇을 해야할지하지 않기 때문에 실행시 실패합니다.

기본적으로 LINQ to SQL은 LINQ to Objects보다 예측하기가 훨씬 어렵습니다. 유용하지 않다는 말은 아닙니다. 단지 약간 다른 세상 일뿐입니다. MS는 당신이 매우 자주 당신이 기대하는대로 일을하지만, 모든 것을 할 수는없는 쿼리를 작성하게하는 놀라운 일을했습니다.

2

LINQ to SQL은 WhereOrderBy에 대해 열 DB 서버의 데이터 정렬을 사용합니다. LINQ to Objects는 문자열 비교를 사용합니다. 따라서 전자는 대소 문자를 구분하지 않고 후자는 대소 문자를 구분합니다. LINQ to Entities는 null을 통합합니다. 나는 L2S가 똑같은 행동을한다고 추정하지만 나는 테스트하지 않았다. L2E에 당신이 할 수 있습니다 : 속성이 null의 경우

let foo = item.Property.SomeNullableType 

... 그리고 foo는 null가됩니다. 그러나 LINQ to Objects에서 다음과 같이해야합니다.

... null 예외가 발생합니다.

+1

예, LinqToSql도 널 (null)을 합체 참조 . –

1

MSDN 참조 herehere이 도움이 될 것입니다.

1

내가 다루는 한 가지 차이점은 그룹화의 차이입니다.

개체에 linq을 그룹화하면 계층 적 모양의 결과 (키, 자식 개체 포함)가 나타납니다.

SQL에서 그룹화 할 때 키와 집계 만 가져옵니다.

linq에서 sql으로 그룹화 할 때 자식 개체 (집계 이상)를 요청하면 linq to sql은 해당 자식 개체를 가져 오기 위해 키를 사용하여 각 그룹을 다시 쿼리합니다. 그룹 수천 명이 있다면 수천 왕복 수 있습니다.

//this is ok 
var results = db.Orders 
    .GroupBy(o => o.CustomerID) 
    .Select(g => new 
    { 
    CustomerId = g.Key, 
    OrderCount = g.Count() 
    }); 

//this could be a lot of round trips. 
var results = db.Orders 
    .GroupBy(o => o.CustomerID) 
    .Select(g => new 
    { 
    CustomerId = g.Key, 
    OrderIds = g.Select(o => o.OrderId) 
    }); 

// this is ok 
// used ToList to separate linqtosql work from linqtoObject work 
var results = db.Orders 
    .Select(o => new {o.CustomerId, o.OrderId}) 
    .ToList() 
    .GroupBy(o => o.CustomerId) 
    .Select(g => new 
    { 
    CustomerId = g.Key, 
    OrderIds = g.Select(o => o.OrderId) 
    });