我尝试以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/