Присоединение таблиц в Entity Framework не может неявно преобразовать ошибку типа - PullRequest
0 голосов
/ 03 мая 2018

Этим вечером я довольно долго застрял, пытаясь присоединиться к столам. У меня есть таблица Challenges с идентификатором категории, и я хочу объединить ее с таблицей Category, чтобы получить фактический заголовок вместо того, чтобы выполнять индексацию во внешнем интерфейсе, который я делаю сейчас.

public List<Challenges> GetChallenges()
{
        var list = new List<Challenges>();
        var queryable = list.AsQueryable();

        var challengesQ = (from ch in challengeContext.Challenges
                           join cc in challengeContext.ChallengeCategories
                                on ch.Category equals cc.Id 
                           select new {
                              id = ch.Id,
                              title = ch.Title,
                              createdAt = ch.CreatedAt,
                              daysNeeded = ch.DaysNeeded,
                              reward = ch.Reward,
                              difficulty = ch.Difficulty,
                              completedBy = ch.CompletedBy,
                              imgUrl = ch.ImgUrl,
                              subcategory = cc.Title,
                              category = cc.Title,
                              instructions = ch.Instructions
                          }
                           );
        DbSet<Challenges> challenges = challengeContext.Challenges;
        DbSet<ChallengeCategories> categories = challengeContext.ChallengeCategories;

        var q = challenges.Join(
            categories,
            ch => ch.Category,
            cc => cc.Id,
            (ch, cc) => new
            {
                id = ch.Id,
                title = ch.Title,
                createdAt = ch.CreatedAt,
                daysNeeded = ch.DaysNeeded,
                reward = ch.Reward,
                difficulty = ch.Difficulty,
                completedBy = ch.CompletedBy,
                imgUrl = ch.ImgUrl,
                subcategory = cc.Title,
                category = cc.Title,
                instructions = ch.Instructions
            });
        return challengesQ;
}

challengesQ и q - некоторые из вещей, которые я пробовал до сих пор, но я получаю эту или похожую ошибку:

CS0266 Невозможно неявно преобразовать тип 'System.Linq.IQueryable <>' в 'System.Collections.Generic.List'. Существует явное преобразование (вам не хватает приведения?) Вызов.EF

Я знаю, что это потому, что мне нужен список IQueryable или другой способ выполнения запроса, но я пока не смог найти правильное решение. У кого-нибудь была подобная проблема?

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Похоже, ваша главная проблема в том, что вы пытаетесь раздать IQueryable анонимного типа вместо IQueryable of Challenges .

В идеале вы должны были бы дать определение вашим объектам POCO (если сначала в коде) или классам в .edmx, если вы используете интерфейс дизайна для своего контекста EF. Таким образом, мы можем убедиться, что вы на самом деле отображаете информацию о соединении в объекты Challenge. Насколько я могу судить, вы делаете это, и я собираюсь ответить на это в соответствии с этим предположением; хотя было бы неплохо быть уверенным.

Мне удалось определить следующее как простой пример EF:

 class Program
{
    static ChallengeContext Context = null;
    static void Main(string[] args)
    {
        try
        {
            var test = GetChallenges();
        }
        finally
        {
            Context.Dispose();
        }
    }
    public static IQueryable<Challenge> GetChallenges()
    {
        Context = new ChallengeContext();
        DbSet<Challenge> challenges = Context.Challenges;
        DbSet<ChallengeCategory> categories = Context.Categories;

       return challenges.Join(
            categories,
            ch => ch.Category,
            cc => cc.Id,
            (ch, cc) => new Challenge()
            {
                Id = ch.Id

            });

    }
}

internal class ChallengeContext:DbContext
{
    public DbSet<Challenge> Challenges { get; set; }
    public DbSet<ChallengeCategory> Categories { get; set; }
}

internal class ChallengeCategory
{
    public int Id { get; set; }
}

public class Challenge
{
    public int Id { get; set; }
    public int Category { get; set; }
}

Что подсказывает мне, что должно работать следующее:

public IQueryable<Challenges> GetChallenges()
{

    DbSet<Challenges> challenges = challengeContext.Challenges;
    DbSet<ChallengeCategories> categories = challengeContext.ChallengeCategories;

    return challenges.Join(
        categories,
        ch => ch.Category,
        cc => cc.Id,
        (ch, cc) => new Challenges()
        {
            id = ch.Id,
            title = ch.Title,
            createdAt = ch.CreatedAt,
            daysNeeded = ch.DaysNeeded,
            reward = ch.Reward,
            difficulty = ch.Difficulty,
            completedBy = ch.CompletedBy,
            imgUrl = ch.ImgUrl,
            subcategory = cc.Title,
            category = cc.Title,
            instructions = ch.Instructions
        });

}

Пожалуйста, дайте мне знать, если это не решит вашу проблему.

0 голосов
/ 03 мая 2018

Вы возвращаете анонимный тип. Вам необходимо проецировать на фактический тип. Заменить select new { на select new Category {

    var q = challenges.Join(
        categories,
        ch => ch.Category,
        cc => cc.Id,
        (ch, cc) => new {ch, cc}
        ).ToList().Select(x=>  new Category  
          {
            id = x.ch.Id,
            title = x.ch.Title,
            createdAt = x.ch.CreatedAt,
            daysNeeded = x.ch.DaysNeeded,
            reward = x.ch.Reward,
            difficulty = x.ch.Difficulty,
            completedBy = x.ch.CompletedBy,
            imgUrl = x.ch.ImgUrl,
            subcategory = x.cc.Title,
            category = x.cc.Title,
            instructions = x.ch.Instructions
        });

OR

         var challengesQ = ( from ch in challengeContext.Challenges
                      join cc in challengeContext.ChallengeCategories
                      on ch.Category equals cc.Id 
                      select new Category  {
                          id = ch.Id,
                          title = ch.Title,
                          createdAt = ch.CreatedAt,
                          daysNeeded = ch.DaysNeeded,
                          reward = ch.Reward,
                          difficulty = ch.Difficulty,
                          completedBy = ch.CompletedBy,
                          imgUrl = ch.ImgUrl,
                          subcategory = cc.Title,
                          category = cc.Title,
                          instructions = ch.Instructions
                      }
                       );
...