我尝试以async的方式从ArtistId查找的Artist中查询所有RelatedArtist。



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


无异步查询

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


具有预期结果的SQL查询

 SELECT * FROM Artists where ArtistId IN (
      SELECT [RelatedArtistId]
      FROM [dbo].[RelatedArtists]
      WHERE artistId = 740
 )


如何进行异步EF Linq查询,该查询将执行上述查询(或非常类似的查询)。

最佳答案

如果您使用的是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();

关于c# - EF LINQ:以异步方式获取自我引用(很多)ICollection项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35917485/

10-15 06:48