返回IEnumerable <t> / IList <t> </t> </t>的问题

时间:2011-03-17 19:58:30

标签: linq entity-framework-4 ienumerable poco

我无法返回IEnumerable和IList,我无法做到! 我正在使用带有POCO的EF 4

以下是整个方法:

//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: 我看到了一个关于朱莉的截屏视频,说“使用EF4时应该总是返回ICollection”。

有关于此的任何想法吗?

BR

修改 当我在调试模式下加载页面时,我得到以下错误: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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

首先,如果Genre在数据库中你应该选择它吗?如果你有来自Genre-> GenreCultureDetails的FK,请告诉我,我可以更新下面的内容,但从它的外观你可以这样做:

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

或者沿着你的路径继续选择它们为annoynmous类型,然后复制它们。如果您愿意,可以使用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;