我有一个postgres数据库并使用asp.net core mvc(+ ef)。数据库已正确创建。我有两张桌子'模块'和' ModuleMenu'。我希望得到给定模块的所有菜单,但我仍未能创建linq查询。
情况
型号:Module.cs
namespace project.Model
{
public class Module
{
[Required]
public string ID { get; set; }
[Required]
public string Name { get; set; }
[Required]
public string Description { get; set; }
}
}
型号:ModuleMenu.cs
namespace project.Models
{
public class ModuleMenu
{
[Required]
public string ID { get; set; }
public int ModuleID { get; set; }
[Required]
public string Title { get; set; }
[ForeignKey("ModuleID")]
public virtual Module Module { get; set; }
}
}
ApplicationDbContext.cs
namespace project.Data
{
public class ApplicationDbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
public DbSet<Module> Modules { get; set; }
public DbSet<ModuleMenu> ModuleMenus { get; set; }
}
}
查询
public List<ModuleMenu> GetModuleMenus(){
var query = from m in _dbContext.ModuleMenus
join mod in _dbContext.Modules on
m.ModuleID equals mod.ID
select m;
return query.ToList();
}
错误
fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[0]
An exception was thrown attempting to execute the error handler.
System.NullReferenceException: Object reference not set to an instance of an object.
有人可以帮我正确创建查询吗?
答案 0 :(得分:2)
您的代码中此部分是否正确?
public int ModuleID { get; set; }
似乎您可能在用于fk的类型中出现错误。 下面我将类型更改为字符串而不是int。
public string ModuleID { get; set; }
根据该更新,查询可能如下所示。
public ModuleMenu[] GetModuleMenusForModule(string moduleId)
{
return _dbContext.ModuleMenus.Where(x => x.ModuleID == moduleId).ToArray();
}
答案 1 :(得分:0)
我希望模型出错(ModelID和ID是不兼容的类型)。如果这是正确的,您的代码应该可行。或者更简单:
(
`name` LIKE '%test%' ESCAPE '!'
OR `description` LIKE '%test%' ESCAPE '!'
)