it-swarm-ko.com

LINQ 및 Lambda와 함께/어디에 가입 하시겠습니까?

LINQ와 Lambda로 작성된 쿼리에 문제가 있습니다. 지금까지 많은 오류가 발생했습니다. 내 코드는 다음과 같습니다.

int id = 1;
var query = database.Posts.Join(database.Post_Metas,
                                post => database.Posts.Where(x => x.ID == id),
                                meta => database.Post_Metas.Where(x => x.Post_ID == id),
                                (post, meta) => new { Post = post, Meta = meta });

LINQ를 처음 사용하기 때문에이 쿼리가 정확한지 확실하지 않습니다.

374
David

SQL 구문에 익숙하다면 LINQ 쿼리 구문을 사용하면 훨씬 명확하고 자연스럽고 오류를 쉽게 찾아 낼 수 있습니다.

var id = 1;
var query =
   from post in database.Posts
   join meta in database.Post_Metas on post.ID equals meta.Post_ID
   where post.ID == id
   select new { Post = post, Meta = meta };

그래도 lambdas를 사용하는 데 정말로 어려움을 겪고 있다면 문법이 다소 벗어난 것입니다. 다음은 LINQ 확장 메서드를 사용하는 동일한 쿼리입니다.

var id = 1;
var query = database.Posts    // your starting point - table in the "from" statement
   .Join(database.Post_Metas, // the source table of the inner join
      post => post.ID,        // Select the primary key (the first part of the "on" clause in an sql "join" statement)
      meta => meta.Post_ID,   // Select the foreign key (the second part of the "on" clause)
      (post, meta) => new { Post = post, Meta = meta }) // selection
   .Where(postAndMeta => postAndMeta.Post.ID == id);    // where statement
859
Daniel Schaffer

이것으로 두 가지 방법을 사용할 수 있습니다. LINQPad (LINQ를 처음 사용하는 경우 매우 중요) 및 더미 데이터베이스를 사용하여 다음과 같은 쿼리를 작성했습니다.

Posts.Join(
    Post_metas,
    post => post.Post_id,
    meta => meta.Post_id,
    (post, meta) => new { Post = post, Meta = meta }
)

또는

from p in Posts
join pm in Post_metas on p.Post_id equals pm.Post_id
select new { Post = p, Meta = pm }

이 특별한 경우에, 나는 LINQ 문법이 더 깨끗하다고 ​​생각한다.

내가 지적하고자하는 점은 데이터베이스에 적절한 외래 키가있는 경우 (post와 post_meta 사이에) 많은 수의 레코드를로드하지 않는 한 명시 적 조인이 필요하지 않을 것입니다 . 귀하의 예제는 귀하가 하나의 게시물을로드하려고 시도하고 메타 데이터임을 나타내는 것 같습니다. 각 게시물에 대해 많은 post_meta 레코드가 있다고 가정하면 다음을 수행 할 수 있습니다.

var post = Posts.Single(p => p.ID == 1);
var metas = post.Post_metas.ToList();

N + 1 문제를 피하려면 LINQ to SQL에 모든 관련 항목을 한꺼번에로드하도록 명시 할 수 있습니다 (L2S에 익숙한 고급 주제 일 수 있음). 아래 예제에서는 "게시물을로드 할 때 'Post_metas'속성으로 표시된 외래 키를 통해 연결된 모든 레코드도로드합니다.

var dataLoadOptions = new DataLoadOptions();
dataLoadOptions.LoadWith<Post>(p => p.Post_metas);

var dataContext = new MyDataContext();
dataContext.LoadOptions = dataLoadOptions;

var post = Posts.Single(p => p.ID == 1); // Post_metas loaded automagically

동일한 유형 또는 여러 유형의 단일 LoadWith 집합에서 많은 DataLoadOptions 호출을 수행 할 수 있습니다. 그래도이 작업을 많이 수행하면 캐싱을 고려할 수 있습니다.

64
Damian Powell

키 선택기가 올바르지 않습니다. 그들은 문제의 테이블 유형의 객체를 가져와 결합에 사용할 키를 반환해야합니다. 나는 당신이 이것을 의미한다고 생각합니다 :

var query = database.Posts.Join(database.Post_Metas,
                                post => post.ID,
                                meta => meta.Post_ID,
                                (post, meta) => new { Post = post, Meta = meta });

나중에 키 선택기의 일부가 아닌 where 절을 적용 할 수 있습니다.

32
Mark Byers

Daniel은 문법적 관계에 대해 잘 설명해주었습니다. 그러나이 문서를 이해하기 쉽도록 조금 더 단순하게 만들기 위해이 문서를 정리했습니다. 희망이 도움이 누군가  enter image description here

27
Talspaugh27

LINQ + EntityFramework를 시작했을 때 나는이 예제를 하루 동안 쳐다 보았습니다.

EntityFramework를 사용 중이고 Meta 모델 객체에서 Post이라는 탐색 속성을 설정 한 경우이 작업은 간단합니다. 엔터티를 사용하고 해당 탐색 속성이없는 경우 무엇을 기다리고 있습니까?

database
  .Posts
  .Where(post => post.ID == id)
  .Select(post => new { post, post.Meta });

먼저 코드를 작성하면 다음과 같이 속성을 설정합니다.

class Post {
  [Key]
  public int ID {get; set}
  public int MetaID { get; set; }
  public virtual Meta Meta {get; set;}
}
6
Visser

나는 이런 것을했다.

var certificationClass = _db.INDIVIDUALLICENSEs
    .Join(_db.INDLICENSECLAsses,
        IL => IL.LICENSE_CLASS,
        ILC => ILC.NAME,
        (IL, ILC) => new { INDIVIDUALLICENSE = IL, INDLICENSECLAsse = ILC })
    .Where(o => 
        o.INDIVIDUALLICENSE.GLOBALENTITYID == "ABC" &&
        o.INDIVIDUALLICENSE.LICENSE_TYPE == "ABC")
    .Select(t => new
        {
            value = t.PSP_INDLICENSECLAsse.ID,
            name = t.PSP_INDIVIDUALLICENSE.LICENSE_CLASS,                
        })
    .OrderBy(x => x.name);
3
Mahib

그것은 뭔가있을 수 있습니다.

var myvar = from a in context.MyEntity
            join b in context.MyEntity2 on a.key equals b.key
            select new { prop1 = a.prop1, prop2= b.prop1};
2
pepitomb

이 linq 쿼리는 당신을 위해 일해야합니다. 게시물 메타가있는 모든 게시물을 가져옵니다.

var query = database.Posts.Join(database.Post_Metas,
                                post => post.postId, // Primary Key
                                meta => meat.postId, // Foreign Key
                                (post, meta) => new { Post = post, Meta = meta });

동등한 SQL 쿼리

Select * FROM Posts P
INNER JOIN Post_Metas pm ON pm.postId=p.postId
0
Ahamed Ishak

1 = 1 2 개의 다른 테이블 조인

var query = from post in database.Posts
            join meta in database.Post_Metas on 1 equals 1
            where post.ID == id
            select new { Post = post, Meta = meta };
0
mtngunay