c# - 不允许在查询中显式构造实体类型 'Artist'

标签 c# linq entity-framework

编译正常,但执行失败,出现标题错误。

ArtistService.cs

public class ArtistService : IArtistService
{
    public List<Artist>  ArtistDetail()  
    {
        using (ArtistDataContext db = new ArtistDataContext())
        {
            return (from artist in db.Artists

                select new Artist()
                {
                    Id = artist.Id,
                    Artist_name = Artist.Artist_name
                }).ToList();     <=== error happened here
        }
    }
}

代码隐藏

private List<ArtistServiceReference.Artist> ArtistDetail()
{
    ArtistServiceReference.ArtistServiceClient client = new 
    ArtistServiceReference.ArtistServiceClient();

    ArtistServiceReference.Artist[] artists = client.ArtistDetail();

    return artists.ToList();

我想将艺术家列表移动到下拉列表。

错误发生在 ArtistService.cs 的末尾 {).ToList(); 关于如何解决此问题的任何解释?谢谢

我的代码基于此示例,并且此示例运行良好。

示例代码MyService.cs

public class MyService : IMyService
{
    public List<Task> GetTasks()
    {
        using (TasksDataContext db = new TasksDataContext())
        {
            return (from task in db.TasksLists
                select new Task()
                {
                    Id = task.taskId,
                    Name = task.taskName,

                }).ToList();
        }
    }
}

示例 default.aspx.cs

private List<TaskService.Task> GetTasks()
{
    TaskService.MyServiceClient client = new TaskService.MyServiceClient();

    TaskService.Task[] tasks = client.GetTasks();

    return tasks.ToList();
}

我不明白为什么这个例子会起作用而我的却不起作用。唯一的区别是这个例子返回到一个 GridView ,而我想返回一个下拉列表。

最佳答案

Linq to Entities 无法将 Artist 对象创建转换为 SQL 代码(真的,这应该是什么样子?)。 Linq to Entities 只能执行 SQL 查询并将返回的字段映射到它知道如何映射到的某个实体(即您的 DbSet 实体)。因此,您需要先执行查询,然后在本地创建艺术家实体:

public class ArtistService : IArtistService
{
    public List<Artist>  ArtistDetail()  
    {
        using (ArtistDataContext db = new ArtistDataContext())
        {
            return (from artist in db.Artists
                    select new { // select only columns you need
                       artist.Id,
                       artist.Artist_name
                    })
                    .AsEnumerable() // execute query
                    .Select(x => new Artist { // create instance of class
                        Id = x.Id,
                        Artist_name = x.Artist_name
                    })
                    .ToList();
        }
    }
}

顺便说一句,您的 Artists DbSet 中似乎有 Artist 实体。为什么不直接返回

 return db.Artists.ToList();

关于c# - 不允许在查询中显式构造实体类型 'Artist',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21265598/

相关文章:

c# - 扩展方法必须在非泛型静态类中定义

c# - 您如何/可以将其重写为 Linq?

c# - EF Core 多个 HTTP 请求抛出错误

c# - 高性能C# TCP服务器问题: No connection could be made because the target machine actively refused it

c# - Web 服务集用户许可证 Office 365

c# - 加载多个数据时 WCF 服务 channel 中的 CommunicationObjectAbortedException

c# - 从对象列表中创建包含多列的 CSV

c# - 如何在没有返回值的情况下从 Linq 语句调用函数?

c# - 将嵌套的 foreach 编写为 LINQ 以聚合两个单独的值

linq - 不支持嵌套查询。操作 1 ='UnionAll' 操作 2 ='MultiStreamNest'