我尝试以{{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查询。
答案 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();