Явное построение типа объекта «Артист» в запросе не допускается.

Компилируется нормально, но выполнение не выполняется с ошибкой в ​​заголовке.

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();
}

Я не понимаю, почему этот пример будет работать, а не мой. Единственная разница в том, что этот пример возвращается к сетке, и я хочу вернуться к раскрывающемуся списку.


person user3127986    schedule 21.01.2014    source источник
comment
Ошибка кажется довольно ясной. Вы не можете создать новый Artist как часть запроса linq. Нельзя ли просто select artist?   -  person Matt Burland    schedule 21.01.2014
comment
Почему тогда работает другой пример?   -  person user3127986    schedule 21.01.2014
comment
Какой тип db.Artists?   -  person Tim S.    schedule 21.01.2014
comment
public System.Data.Linq.Table‹Artist› Исполнители   -  person user3127986    schedule 21.01.2014
comment
Если это уже Artist, зачем вы пытаетесь сделать из них новые Artist? (или это разные классы в разных пространствах имен?)   -  person Tim S.    schedule 21.01.2014
comment
Означает ли это, что пример, который я использую, неверен?   -  person user3127986    schedule 21.01.2014


Ответы (1)


Linq to Entities не может перевести создание объекта Artist в код SQL (правда, как это должно выглядеть?). Linq to Entities может только выполнять SQL-запросы и сопоставлять возвращаемые поля с какой-либо сущностью, с которой он знает, как сопоставлять (т. е. ваши сущности DbSet). Итак, вам нужно сначала выполнить запрос, а затем локально создать сущности Artist:

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();
        }
    }
}

Кстати, похоже, что у вас есть Artist объекта в вашем Artists DbSet. Почему бы просто не вернуться

 return db.Artists.ToList();
person Sergey Berezovskiy    schedule 21.01.2014
comment
Я пробую ваше решение с возвратом db.Artists.ToList(). Чтобы заполнить раскрывающийся список на page_Load, я сделал это. DropDownList1.DataSource = ArtistDetail(); DropDownList1.DataBind(); Это вызвало ошибку, потому что я использую на странице .aspx DataTextField=Artist_name DataSourceID =Id - person user3127986; 21.01.2014
comment
DropDownList1.DataSource = ArtistDetail(); DropDownList1.DataBind(); ‹=== error И DataSource, и DataSourceID определены в DropDownList1. Удалите одно определение. Я закомментировал первый. Затем я получил эту ошибку. DataSourceID «DropDownList1» должен быть идентификатором элемента управления типа IDataSource. Не удалось найти элемент управления с идентификатором «Id». - person user3127986; 21.01.2014
comment
@user3127986 перейдите к разметке страницы, найдите этот элемент управления DropDownList и удалите из него DataSourceID - person Sergey Berezovskiy; 21.01.2014
comment
‹asp:DropDownList ID=DropDownList1 должен ли я полностью удалить ID=DropDownList1 или просто удалить имя ID= ? Если я удалю его, у меня будет много ошибок, потому что я использую DropDownList1.SelectedValue; - person user3127986; 21.01.2014
comment
@user3127986 user3127986 нет, должен быть атрибут DataSourceID. Если его там нет, проверьте код позади - вы назначаете его из кода - person Sergey Berezovskiy; 21.01.2014
comment
Я получил это в ‹asp: DropDownList1 DataTextField=Artist_name DataSourceID =Id Я удаляю DataSourceId=id и..... ЭТО РАБОТАЕТ!!!!!! Аллилуйя!!! Большое спасибо... Я думаю, что пример, который я использовал, не очень хорош... Спасибо за вашу помощь. - person user3127986; 21.01.2014
comment
@user3127986 user3127986 добро пожаловать :) В следующий раз внимательно прочитайте сообщение об исключении - оно часто содержит все, что вам нужно знать - person Sergey Berezovskiy; 21.01.2014