[不确定我是否说对了,但是我在net core 3.1中有一个剃须刀页面业务应用程序,其中有很多对许多连接。我现在只是在进行一个联接,并试图通过存储库调用将结果馈送到kendo网格这是示例的模型,它们是“ Notes”和“ NoteTypes”,并由“ NoteNoteTypeJoins”连接]
public class Note
{
public int ID { get; set; }
[Display(Name = "Short Title")]
[Required]
public String Title { get; set; }
[Display(Name = "Note Content")]
public String NoteText { get; set; }
public int UserID { get; set; }
//some fields left out for brevity
public ICollection<NoteStaffJoin> NoteStaffJoins { get; set; }
public ICollection<NoteClientJoin> NoteClientJoins { get; set; }
public ICollection<NoteOrgJoin> NoteOrgJoins { get; set; }
public ICollection<NoteNoteTypeJoin> NoteNoteTypeJoins { get; set; }
}
public class NoteNoteTypeJoin
{
public int NoteNoteTypeJoinID { get; set; }
public int NoteID { get; set; }
public int NoteTypeID { get; set; }
public DateTime? Saved { get; set; }
public int? UserID { get; set; }
public Note Note { get; set; }
public NoteType NoteType { get; set; }
}
public class NoteType
{
public int ID { get; set; }
public string Type { get; set; }
public int? ParentID { get; set; }
public int? NoteTypeGroupID { get; set; }
public int? DisplayOrder { get; set; }
public int? UserID { get; set; }
public ICollection<NoteNoteTypeJoin> NoteNoteTypeJoins { get; set; }
}
public FliveRetryContext(DbContextOptions<FliveRetryContext> options)
: base(options)
{
public DbSet<FliveRetry.Models.Note> Note { get; set; }
public DbSet<FliveRetry.Models.NoteType> NoteType { get; set; }
public DbSet<FliveRetry.Models.NoteNoteTypeJoin> NoteNoteTypeJoin { get; set; }
}
据我用ef core看到,外键等都正确定义了>>
CREATE TABLE [dbo].[NoteNoteTypeJoin] ( [NoteNoteTypeJoinID] INT IDENTITY (1, 1) NOT NULL, [NoteID] INT NOT NULL, [NoteTypeID] INT NOT NULL, [Saved] DATETIME2 (7) NULL, [UserID] INT NULL, CONSTRAINT [PK_NoteNoteTypeJoin] PRIMARY KEY CLUSTERED ([NoteNoteTypeJoinID] ASC), CONSTRAINT [FK_NoteNoteTypeJoin_Note_NoteID] FOREIGN KEY ([NoteID]) REFERENCES [dbo].[Note] ([ID]) ON DELETE CASCADE, CONSTRAINT [FK_NoteNoteTypeJoin_NoteType_NoteTypeID] FOREIGN KEY ([NoteTypeID]) REFERENCES [dbo].[NoteType] ([ID]) ON DELETE CASCADE ); GO CREATE NONCLUSTERED INDEX [IX_NoteNoteTypeJoin_NoteID] ON [dbo].[NoteNoteTypeJoin]([NoteID] ASC); GO CREATE NONCLUSTERED INDEX [IX_NoteNoteTypeJoin_NoteTypeID] ON [dbo].[NoteNoteTypeJoin]([NoteTypeID] ASC);
上周,我已经在网络上尝试了每个示例,但无法正确完成。我最终使用联接表中的ID来使它工作,而该表不需要调用NoteTypes表:
public async Task<List<Note>> GetAllNotesForNoteTypeIDAsync(int notetypeid) { var noteData = await context.Note .Include(n => n.NoteNoteTypeJoins) .ThenInclude(t => t.NoteType) .Where(i => i.NoteNoteTypeJoins.Any(x => x.NoteTypeID == notetypeid)) .ToListAsync(); return noteData; }
我必须将此referenceloophandling选项添加到startup.cs才能使包含项完全起作用,感谢Telerik提供的信息:
services.AddRazorPages().AddNewtonsoftJson (options => { options.SerializerSettings.ContractResolver = new DefaultContractResolver(); options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; });
这同样适用,即使包括其他表,也仅查询左表:
public async Task<List<Note>> GetAllNotesForUserAsync(int userId) { var noteData = await context.Note .Include(n => n.NoteNoteTypeJoins) .ThenInclude(t => t.NoteType) .Where(i => i.UserID == userId) .ToListAsync(); return noteData; }
我想按NoteType文本而不是ID进行搜索,因为ID在不同的发行版中可能不同。这是我目前所拥有的,但是它像很多其他变体一样使页面崩溃:
public async Task<List<Note>> GetAllNotesForNoteTypeAsync(string notetype) { var noteData = await context.Note .Include(n => n.NoteNoteTypeJoins) .ThenInclude(t => t.NoteType) .Where(i => i.NoteNoteTypeJoins.Any(x => x.NoteType.Type.ToString() == notetype)) .ToListAsync(); return noteData; }
此崩溃并显示以下消息:
An unhandled exception occurred while processing the request. InvalidOperationException: The LINQ expression 'DbSet<NoteNoteTypeJoin> .Where(n0 => EF.Property<Nullable<int>>((EntityShaperExpression: EntityType: Note ValueBufferExpression: (ProjectionBindingExpression: EmptyProjectionMember) IsNullable: False ), "ID") != null && EF.Property<Nullable<int>>((EntityShaperExpression: EntityType: Note ValueBufferExpression: (ProjectionBindingExpression: EmptyProjectionMember) IsNullable: False ), "ID") == EF.Property<Nullable<int>>(n0, "NoteID")) .Join( outer: DbSet<NoteType>, inner: n0 => EF.Property<Nullable<int>>(n0, "NoteTypeID"), outerKeySelector: n1 => EF.Property<Nullable<int>>(n1, "ID"), innerKeySelector: (o, i) => new TransparentIdentifier<NoteNoteTypeJoin, NoteType>( Outer = o, Inner = i )) .Any(n0 => n0.Inner.Type.ToString() == __notetype_0)' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.
我也没有对上一个联接的智能访问,这阻止了我在论坛上使用大量建议,因此.Where(n => n.NoteNoteTypeJoins.Type == notetype)之类的东西不可用,因为.Type在NoteNoteTypeJoins之后不可用。
这些是我需要过滤的四个多对多关系:
Note = await _context.Note .Include(i => i.NoteOrgJoins).ThenInclude(i => i.Org) .Include(i => i.NoteClientJoins).ThenInclude(i => i.Client) .Include(i => i.NoteStaffJoins).ThenInclude(i => i.Staff) .Include(i => i.NoteNoteTypeJoins).ThenInclude(i => i.NoteType)
[如果有人可以建议一个有效的导航电话而不是加入,至少可以使我摆脱笔记类型电话的麻烦,我会很高兴,如果您可以向我展示如何添加其他电话,那会更好。我仍在学习C#和剃须刀,因此它可能不在通话本身内,但我尝试遵循标准设置。
感谢所有人
[不确定我是否说对了,但是我在net core 3.1中有一个剃须刀页面业务应用程序,其中有很多对许多连接。我现在只是在进行一个联接,并试图将结果提供给...
我也没有对上一个联接的智能访问,这阻止了我在论坛上使用大量建议,因此.Where(n => n.NoteNoteTypeJoins.Type == notetype)之类的东西不可用,因为.Type在NoteNoteTypeJoins之后不可用。