C#,EF:从Sql Query中映射[NotMapped]值

时间:2018-01-07 21:04:40

标签: c# entity-framework

我正在使用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对象与正确的父对象关联。

这就是我如何去这里。

2 个答案:

答案 0 :(得分:0)

字段已映射或不是,您无法双向拥有它!

查看AutoMapper和AutoMapperEF扩展。 EF扩展非常聪明,可以实现只有查询中选择的字段的模型只会在生成的SELECT中包含这些字段。对于同一查询,您可以有多个不同的模型,每个模型只返回该模型所需的字段。

答案 1 :(得分:0)

您可以做的(不更改模型)是在加载之前将NonMappedField+"_"+anotherfield连接为anotherfield

在FromSql加载之后,您可以将NonMappedFieldanotherfield拆分回去。

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();