首页 > 解决方案 > 使用 LINQ 从 db 中选择不同的列名

问题描述

我有一个表,其中包含多个列,包括 CarMake、CarModel、CarModelLoading 等。我想选择不同的 CarMake 并将它们作为列表返回。我尝试了以下方法:

public IEnumerable<EbimaCarMakesAndModel> GetAll()
        {
            //var list<ebima>
            return (IEnumerable<EbimaCarMakesAndModel>)context.EbimaCarMakesAndModels.Select(l => new { l.CarMake }).Distinct().ToList();
            //var data = (from dbo in context.EbimaCarMakesAndModels where dbo.Listed == "Y" select dbo.CarMake).Distinct().OrderBy(name => name).ToList();

            //return (IEnumerable<EbimaCarMakesAndModel>)data;
}

但是每当运行该应用程序时,我都会收到错误消息:

处理请求时发生未处理的异常。InvalidCastException:无法将“System.Collections.Generic.List 1[<>f__AnonymousType311[System.String]]”类型的对象转换为“System.Collections.Generic.IEnumerable`1[motor_backend.Models.EbimaCarMakesAndModel]”类型。我也尝试了以下但无济于事:

public IEnumerable<EbimaCarMakesAndModel> GetAll()
    {
        var res = context.EbimaCarMakesAndModels.GroupBy(x => new { x.CarMake }).
            Select(x => x.FirstOrDefault()).Where(v => v.Listed == "Y").ToList();
        return res;
     }

它给了我以下错误:

FirstOrDefault()' 无法翻译。以可翻译的形式重写查询,或通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用显式切换到客户端评估。有关详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=2101038

到目前为止,这里给出的所有解决方案都没有回答我的问题

标签: c#linqwebapi

解决方案


要么声明您的方法以返回字符串的 IE:

public IEnumerable<string> GetAllMakes()

并且您的查询不创建匿名类型,而只需选择 make:

return context.EbimaCarMakesAndModels.Select(l => l.CarMake).Distinct().ToList();

或按 make 分组并从组列表中返回一些名义条目(但这对我来说真的没有意义)

return context.EbimaCarMakesAndModels.GroupBy(x => x.CarMake)
       .Select(x => x.FirstOrDefault()).ToList();

您的最后一个查询引入了一些额外的未提及的约束 - 也许在分组之前.Where(v => v.Listed == "Y")考虑这样做EbimaCarMakesAndModels


推荐阅读