Проблема возврата IEnumerable <T>/ IList <T> - PullRequest
0 голосов
/ 17 марта 2011

У меня проблемы с возвратом IEnumerable и IList, я не могу этого сделать!Я использую EF 4 с POCO

Вот весь метод:

//public IList<Genre> GetGenresByGame(int gameId)
public IEnumerable<Genre> GetGenresByGame(int gameId)
    {
        using(var ctx = new XContext())
        {
            var results =
                    from t0 in ctx.GameGenres
                    join t1 in ctx.GenreCultureDetails on t0.GenreId equals t1.GenreId
                    where t0.GameId == gameId && t1.CultureId == _cultureId
                    select new Genre
                    {
                        GenreId = t0.GenreId,
                        GenreName = t1.GenreName

                    };

            return results.ToList(); 
        }
    }

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

Вопрос 2: Я видел что-то с Джулией, где говорилось, что «Вы всегда должны возвращать ICollection» при использовании EF4.

Есть мысли по этому поводу?*

РЕДАКТИРОВАТЬ: Когда я загружаю страницу в режиме отладки, я получаю следующие ошибки: The ObjectContext instance has been disposed and can no longer be used for operations that require a connection. OR The entity or complex type 'XModel.Genre' cannot be constructed in a LINQ to Entities query.

Ответы [ 2 ]

2 голосов
/ 17 марта 2011

Genre не должен быть типом L2EF.Попробуйте это:

public IEnumerable<Genre> GetGenresByGame(int gameId)
{
    using(var ctx = new XContext())
    {
        var resultList =
                from t0 in ctx.GameGenres
                join t1 in ctx.GenreCultureDetails on t0.GenreId equals t1.GenreId
                where t0.GameId == gameId && t1.CultureId == _cultureId
                select new { t0.GenreId, t1.GenreName };
        var genres = resultList.AsEnumerable().Select(o => new Genre
                     {
                         GenreId = o.GenreId,
                         GenreName = o.GenreName
                     });
        return genres.ToList();
    }
}
0 голосов
/ 17 марта 2011

Прежде всего, если жанр в базе данных, вы должны выбрать его?Если у вас есть FK из Genre-> GenreCultureDetails, дайте мне знать, и я могу обновить ниже, но, судя по всему, вы можете сделать это так:

using(var ctx = new XContext())
{
    var results =
            from g in ctx.Genre
            join gcd in ctx.GenreCultureDetails on g.GenreId equals gcd.GenreId
            where g.GameId == gameId && gcd.CultureId == _cultureId
            select g;


    return result.ToList();
}

В качестве альтернативы продолжите свой путь, выберитеих в раздражающий тип, а затем скопировать их.Вы можете использовать select вместо convertall, если хотите.

IList<Genre> returnMe = Null;
using(var ctx = new XContext())
{
    var results =
            from t0 in ctx.GameGenres
            join t1 in ctx.GenreCultureDetails on t0.GenreId equals t1.GenreId
            where t0.GameId == gameId && t1.CultureId == _cultureId
            select new
            {
                GenreId = t0.GenreId,
                GenreName = t1.GenreName

            };

    returnMe  = results.ToList().ConvertAll(x=>new Genre(){
                           GenreId = x.GenreId,
                           GenreName = x.GenreName
                           }
          );
}
return returnMe;
...