使用EF Core

时间:2018-05-11 21:14:19

标签: c# linq asp.net-core ef-core-2.0

我刚修改了linq查询以包含索引。索引是帮助客户端Web应用程序管理返回的项目(添加,删除,更新,复制等)所必需的。该部分正在使用客户端的模型数据,因此它需要从服务器返回的相同类型的格式结构。索引应按顺序排列为0,1,2,..

下面是我正在尝试做的一个例子:

让我们说我想找到一个有州/省的国家的城市名单。

所以我有以下两个类:

public class CityItemDTO {
   public int id { get; set; }
   public City item {get; set; }
}

public class CityDTO {
    public string name {get; set;}
    public string stateName {get; set; }
    public int population {get; set; }
}

我想添加索引以及城市和州属性列表:

var cities = context.Countries
    .Where(s => query.Name == s.Name)
    .Select((s,index) => new CityItemDTO
    {
        id = index,
        item = new CityDTO()
        {
            name = s.name,
            stateName = s.stateName
            population = s.population
        }
    });

但是我得到一个奇怪的错误:

  

“无法解析表达式”值(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1 [DataService.Models.Countries])。其中(s =>(__ query_Name_0 == s.Name))。选择(( s,index)=> new CityItemDTO(){id = index,item = new CityDTO(){Name = s.Name,StateName = s.StateName,Population = s.Population}})':此方法的重载目前不支持“System.Linq.Queryable.Select”。“

但是,如果我取出索引,则以下内容有效:

var cities = context.Countries
    .Where(s => query.Name == s.Name)
    .Select(s => new CityDTO
    {
        new CityDTO()
        {
            name = s.name,
            stateName = s.stateName
            population = s.population
        }
    });

2 个答案:

答案 0 :(得分:1)

显然这个问题之前已经得到了回答,因为新的框架,错误信息不同,而且由于我得到答案的方式,认为预测干扰了索引器的工作方式。

LINQ to Entities does not recognize the method 'System.Linq.IQueryable`

我所要做的就是添加一个AsEnumerable(),它将结果转换为C#对象,然后select(保留我原来拥有的逻辑)然后将索引添加到迭代中。

var cities = context.Countries
.Where(s => query.Name == s.Name)
.AsEnumerable()    //  where the magic happens
.Select(s => new CityDTO
{
    new CityDTO()
    {
        name = s.name,
        stateName = s.stateName
        population = s.population
    }
});

答案 1 :(得分:-1)

实际上,LINQ 查询可以简单地通过 dbfunction row_number() over () 转换为索引行(至少对于 postgreSQL),但目前(2021 年 2 月)仍然不受支持。