gpt4 book ai didi

c# - EF LINQ : Get self referencing (many to many) ICollection items in async manner

转载 作者:行者123 更新时间:2023-11-30 23:28:39 25 4
gpt4 key购买 nike

我尝试通过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 : Get self referencing (many to many) ICollection items in async manner,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35917485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com