实体框架对数据库中不存在的列进行排序

时间:2017-02-07 07:32:25

标签: c# entity-framework sorting

在我的模型中,我有一个属性是其他模型的组合。

        public string PiramideId => (string.IsNullOrWhiteSpace(GEMEENTECODE) ? "" : GEMEENTECODE.Trim()) + "-" + (string.IsNullOrWhiteSpace(WIJKCODE) ? "" : WIJKCODE.Trim()) + "-" + (string.IsNullOrWhiteSpace(GROEPCODE) ? "" : GROEPCODE.Trim()) + "-" + (string.IsNullOrWhiteSpace(STRAATCODE) ? "" : STRAATCODE.Trim()) + "-" + (string.IsNullOrWhiteSpace(GEBOUWCODE) ? "" : GEBOUWCODE.Trim()) + "-" + (string.IsNullOrWhiteSpace(HUISNR) ? "" : HUISNR.Trim());

当我尝试对PiramideId进行排序时,我在Entity Framework中进行调用时,EF返回一个错误,指出该列在数据库中不存在。有没有办法告诉EF,列PiramideId基本上是几种组合在一起的?

我在获取所有项目列表后尝试排序,即使这样做也不是我想要的,因为那时我必须在我的数据库中获取所有记录,而我只想要前30名。

查询示例:

PagedView.Context.PERSOON.Join(PagedView.Context.VERHURINGEN, persoon => persoon.ComputerNr,
                        verhuring => verhuring.PersoonsID, (persoon, verhuring) => new {persoon, verhuring})
                    .Join(PagedView.Context.EENHEID, @t => @t.verhuring.Eenheid, eenheid => eenheid.ComputerNr,
                        (@t, eenheid) => new PersoonDTO
                        {
                            ComputerNr = @t.persoon.ComputerNr,
                            FAMILIENAAM = @t.persoon.FAMILIENAAM,
                            VOORNAAM = @t.persoon.VOORNAAM,
                            NAAM = @t.persoon.NAAM,
                            ADRES = @t.persoon.ADRES,
                            Een = eenheid
                        }).OrderBy(p => p.Een.PiramideId).ToList();

1 个答案:

答案 0 :(得分:1)

实体框架的工作原理是生成SQL语句,查询数据库,然后将结果映射到模型。在这种特殊情况下,它不能生成SQL语句,因为它不知道PiramideId是什么。你可以通过执行查询然后排序来解决这个问题。让它执行查询的最简单方法是使用AsEnumerable。这给你

PagedView.Context.PERSOON
                 .Join(PagedView.Context.VERHURINGEN, 
                       persoon => persoon.ComputerNr,
                       verhuring => verhuring.PersoonsID,
                       (persoon, verhuring) => new {persoon, verhuring})
                 .Join(PagedView.Context.EENHEID,
                       @t => @t.verhuring.Eenheid,
                       eenheid => eenheid.ComputerNr,
                       (@t, eenheid) => new PersoonDTO
                       {
                           ComputerNr = @t.persoon.ComputerNr,
                           FAMILIENAAM = @t.persoon.FAMILIENAAM,
                           VOORNAAM = @t.persoon.VOORNAAM,
                           NAAM = @t.persoon.NAAM,
                           ADRES = @t.persoon.ADRES,
                           Een = eenheid
                       })
                 .AsEnumerable()
                 .OrderBy(p => p.Een.PiramideId)
                 .ToList();