EF LINQ:以异步方式获取自我引用(多对多)ICollection项目

时间:2016-03-10 13:09:58

标签: c# entity-framework linq asynchronous

我尝试以{{1>}的方式查询 ArtistId 找到的艺术家中的所有 RelatedArtist

async

上下文

 public class Artist
 {
      public int ArtistId { get; set; }

     public virtual ICollection<Artist> RelatedArtists {get;set;}
 }

无异步查询

modelBuilder.Entity<Artist>()
          .HasMany(x => x.RelatedArtists)
          .WithMany().Map(x =>
          {
              x.MapLeftKey("ArtistId");
              x.MapRightKey("RelatedArtistId");
              x.ToTable("RelatedArtists");
          });

带有预期结果的SQL查询

 Context.Artists.First(x => x.ArtistId == artistId)
      .RelatedArtists
      .ToList()

如何创建执行上述查询(或非常类似)的异步EF Linq查询。

1 个答案:

答案 0 :(得分:2)

如果您使用的是EF 6,则可以使用FirstOrDefaultAsync扩展方法:

var entity=await Context.Artists.FirstOrDefaultAsync(x => x.ArtistId == artistId);
if(entity!=null)
{
 var list=entity.RelatedArtists.ToList();
}

如果您想查看可以使用的所有异步方法的列表,请转到此msdn page以查看所有IQueryable<T>扩展方法。

Code First会将单向关联作为一对多关联,现在如果您决定在模型中映射FK以识别根Artist,那么您的查询可能会更好:

public class Artist
{
  public int ArtistId { get; set; }

  public int? RelatedToId{ get; set; }
  public virtual Artist RelatedTo {get;set;}

 public virtual ICollection<Artist> RelatedArtists {get;set;}
}

使用Fluent Api配置此关系将是:

modelBuilder.Entity<Artist>().HasOptional(a=>a.RelatedTo).WithMany(a=>a.RelatedArtist).HasForeignKey(a=>a.RelatedToId);

然后您的查询如下:

var list =await Context.Artists.Where(a=>a.RelatedToId==artistId).ToListAsync();

更新

你可以试试这个:

var list= await Context.Artists.Where(a=>a.RelatedArtists.Any(e=>e.Id==artistId)).ToListAsync();