我正在使用Entity Framework。我目前在我的模型类中有一个标记为[NotMapped]
的属性。我也使用一个查询来恢复该值(从视图中,这就是为什么它没有映射)。
var list = context.Database
.SqlQuery<SomeModel>("SELECT NonMappedField, anotherfield FROM SomeView")
.ToList()
有没有办法可以提示C#,对于这个实例,它应该将原始查询中的列映射到我的模型?
我会有更多东西展示我尝试过的东西,但除了构建我自己的映射器之外,我没有丝毫知道下一步该做什么,这似乎是一个非常脆弱的解决方案。
可能的X / Y问题:
我的数据模型有父/子关系。 Child可以是多个模型的子项,因此需要使用连接表ParentChildJoin。当我做的时候
context.Database.Parent.Where...Include( n => n.Children ).ToList();
我遇到了一些可疑行数很少的查询超时。因此,我有一个明智的想法,即将ParentChildJoin表与View中的Child表一起加入并以这种方式检索子项。这有效,但我需要一些方法将检索到的Child对象映射到它们的Parent。
这是NotMapped字段的来源。我可以在我的模型上创建一个NonMapped字段,然后当我从View中检索时,我可以将ParentId存储在那里。从那里,我可以将Child对象与正确的父对象关联。
这就是我如何去这里。
答案 0 :(得分:0)
字段已映射或不是,您无法双向拥有它!
查看AutoMapper和AutoMapperEF扩展。 EF扩展非常聪明,可以实现只有查询中选择的字段的模型只会在生成的SELECT
中包含这些字段。对于同一查询,您可以有多个不同的模型,每个模型只返回该模型所需的字段。
答案 1 :(得分:0)
您可以做的(不更改模型)是在加载之前将NonMappedField+"_"+anotherfield
连接为anotherfield
。
在FromSql加载之后,您可以将NonMappedField
和anotherfield
拆分回去。
var query = "SELECT [Id], CONVERT(VARCHAR(1024),[NonMappedField]+'|'+[anotherfield]) AS [anotherfield] FROM myView";
var list = _context.SomeModels.FromSql(query)
.Select(i => new SomeModel {
Id = i.Id,
NonMappedField = i.anotherfield.Substring(0, i.anotherfield.IndexOf('|')),
anotherfield = i.anotherfield.Substring(i.anotherfield.IndexOf('|')+1)
}).ToList();