实体框架Linq到对象映射

时间:2016-04-21 15:17:46

标签: c# entity-framework linq

我有一个问题。

数据库Shema

==================
|parts           |
==================
| partId |textId |
==================

========================
texts                  |
========================
|TextId|LanguageId|text|
========================

============================
languages                  |
============================
|LanguageId|LanguageIsoCode|
============================

我想将此结果映射到以下对象

public long PartId { get; set; }
public Dictionary<string,string> Name { get; set; }

例如

{
  PartId: 32020
  Name: {["en": "Blah", "es": "Blah2"]}
}

这是我尝试过的,但是我遇到了这个查询而遇到了TimeOut。

var query = (from p in _context.epc_parts
         select new //select first dynamic object
         {
             PartId = p.PartID,
             Code = p.PartName,
             Name = (from trans in _context.epc_texts
                     join lang in _context.epc_languages on trans.LanguageID equals lang.LanguageID
                     where p.TextID == trans.TextID
                     select new
                     {
                         LanguageId = lang.shortname.ToLower(),
                         Caption = trans.Caption
                     })

         }).AsEnumerable().Select(x => new SearchPartModel //transform it here when we can use dictionary
         {
             Code = x.Code,
             PartId = x.PartId,
             Name = x.Name.ToDictionary(t => t.LanguageId, t => t.Caption)
         });

零件表每行有大约60k行,有7个翻译。导航属性无法使用,因为Shema不使用外键,模型是从db生成的。

2 个答案:

答案 0 :(得分:1)

我用这个查询解决了它。对于整个查询,大约花了20多秒来加载所有可以用于此目的的东西。我先用小组。

(from p in _context.epc_parts
                     join trans in _context.epc_texts on p.TextID equals trans.TextID
                     join lang in _context.epc_languages on trans.LanguageID equals lang.LanguageID
                     select new
                     {
                         PartId = p.PartID,
                         Code = p.PartName,
                         Caption = trans.Caption,
                         LanguageId = lang.shortname.ToLower()
                     }).AsEnumerable().GroupBy(x => x.PartId).Select(g => new SearchPartModel
                     {
                         Code = g.Select(x => x.Code).FirstOrDefault(),
                         PartId = g.Key,
                         Name = g.Select(x => new
                         {
                             x.LanguageId,
                             x.Caption
                         }).Distinct().ToDictionary(y => y.LanguageId, y => y.Caption)
                     });

答案 1 :(得分:0)

from p in _context.epc_parts
join trans in _context.epc_texts on p.TextID equals trans.TextID
join lang in _context.epc_languages on trans.LanguageID equals lang.LanguageID

select new {   
             PartId = p.PartID,
             Code = p.PartName,
             Name = new
                 {
                     LanguageId = lang.shortname.ToLower(),
                     Caption = trans.Caption
                 }

}

这应该会更好,否则在您查询part表的每个texts的当前实现中