我遇到了用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 });

我不确定这个问题是否正确。


当前回答

Daniel很好地解释了语法关系,但是为了让我的团队更容易理解,我把这个文档放在一起。希望这对大家有所帮助

其他回答

您的键选择器不正确。它们应该接受与所讨论的表类型相同的对象,并返回在连接中使用的键。我想你的意思是:

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

您可以随后应用where子句,而不是作为键选择器的一部分。

这个linq查询应该为您工作。它会得到所有有post meta的帖子。

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

Daniel很好地解释了语法关系,但是为了让我的团队更容易理解,我把这个文档放在一起。希望这对大家有所帮助

可能是这样的

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 + EntityFramework时,我盯着这些例子看了一天。

如果你正在使用EntityFramework,并且你在Post模型对象上设置了一个名为Meta的导航属性,这非常简单。如果你用的是实体,没有导航属性,还在等什么?

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;}
}