繁体   English   中英

在Linq to Entities查询中选择第一项

[英]Pick the first item in a Linq to Entities query

我有以下代码:

  context.Posts
    .SelectMany(x => x.Packs
      .SelectMany(y => y.Files, (y, z) => new {
        File = new { Key = z.Key }
      })        
      .Select(y => new PostModel {
        Id = x.Id,
        File = y.File.Key,
        Types = x.Types
      })
    ).ToList();

这是可行的,但是一个帖子有许多PostLocalized。

我想在我的查询中选择PostLocalized哪个.Culture ==文化。

而且我需要使用其数据来创建PostModel。 就像是:

  context.Posts
    // PICK the first PostLocalized which .Culture property equals culture 
    .SelectMany(x => x.Packs
      .SelectMany(y => y.Files, (y, z) => new {
        File = new { Key = z.Key }
      })        
      .Select(y => new PostModel {
        Id = x.Id,
        File = y.File.Key,
        Types = x.Types,
        //Title = PostLocalized.Title,
        //Body = PostLocalized.Body
      })
    ).ToList();

我怎样才能做到这一点?

注意:

Post和PostLocalized实体如下:

public class Post {
  public Int32 Id { get; set; }
  public Boolean Active { get; set; }
  public PostTypes Types { get; set; }

  public virtual ICollection<PostLocalized> PostsLocalized { get; set; }
} // Post

public class PostLocalized {

  public Int32 Id { get; set; }
  public String Culture { get; set; }
  public String Body { get; set; }
  public String Title { get; set; }

  public virtual Post Post { get; set; }
  public virtual ICollection<Pack> Packs { get; set; }

} // PostLocalized

public class Pack {
  public Int32 Id { get; set; }
  public Boolean Active { get; set; }
  public DataType Type { get; set; }
  public DateTime Updated { get; set; }

  public virtual ICollection<File> Files { get; set; }
  public virtual ICollection<PostLocalized> PostsLocalized { get; set; }    
} // Pack

public class File {
  public Int32 Id { get; set; }
  public Byte[] Data { get; set; }
  public Guid Key { get; set; }
  public String Mime { get; set; }
  public virtual Pack Pack { get; set; }
} // File

谢谢米格尔

它本身并不完全美观或高效,但是它至少应该可以工作,并且查询优化器有望使其更快。

context.Posts
       .SelectMany(post => post.Packs
       .SelectMany(pack => pack.Files
       .Select(file => new PostModel
                       {
                          Id = post.Id,
                          File = file.Key,
                          Types = post.Types,
                          Title = post.PostsLocalized.First(pl => pl.Culture == culture).Title,
                          Body = post.PostsLocalized.First(pl => pl.Culture == culture).Body
                       })))
       .ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM