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를 처음 사용하기 때문에이 쿼리가 정확한지 확실하지 않습니다.
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
이것으로 두 가지 방법을 사용할 수 있습니다. 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
호출을 수행 할 수 있습니다. 그래도이 작업을 많이 수행하면 캐싱을 고려할 수 있습니다.
키 선택기가 올바르지 않습니다. 그들은 문제의 테이블 유형의 객체를 가져와 결합에 사용할 키를 반환해야합니다. 나는 당신이 이것을 의미한다고 생각합니다 :
var query = database.Posts.Join(database.Post_Metas,
post => post.ID,
meta => meta.Post_ID,
(post, meta) => new { Post = post, Meta = meta });
나중에 키 선택기의 일부가 아닌 where 절을 적용 할 수 있습니다.
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;}
}
나는 이런 것을했다.
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);
그것은 뭔가있을 수 있습니다.
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};
이 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
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 };