2011-03-17 79 views
0

我无法返回IEnumerable和IList,我无法做到这一点! 我使用EF 4波苏斯返回IEnumerable的问题<T>/IList <T>

这里是整个方法:

//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: 我在Julie看到一个截屏视频,说使用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

+4

什么在这里不起作用? – Snowbear 2011-03-17 19:59:54

+0

只是一个随机问题,但你的数据库中存在流派吗?如果是这样,你为什么不选择呢? – Nix 2011-03-17 20:18:25

+0

是的,Genre确实存在于数据库中。选择,你是什么意思? – n3tx 2011-03-17 20:20:39

回答

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

我相信最好先使用'AsEnumerable'(你有ToList'),然后使用'ToList'。 – Snowbear 2011-03-17 20:33:41

+0

@Snowbear:'AsEnumerable()'不会执行查询(事实上,它不会执行任何操作),因此会导致OP出现同样的问题。请参阅http://stackoverflow.com/questions/3389855/am-i-misunderstanding-linq-to-sql-asenumerable/3389908#3389908 – 2011-03-17 20:36:01

+0

@BlueRaja,正确的,你不需要马上执行那一点,你需要它该方法内的某处。你所需要的只是将下一个'Select'看作IEnumerable.Select而不是IQueryable.Select和AsEnumerable来做。 – Snowbear 2011-03-17 20:38:07

0

首先,如果Genre在数据库中,您应该选择它?如果从Genre-有FKS> 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; 
+0

你的两个变化有什么意义? 'AsEnumerable'不会影响它,没有'()'的'Genre'只是一个语法糖。 – Snowbear 2011-03-17 20:08:33

+0

括号不会改变任何内容。 '新流派(){GenreID = xyz};''和'新流派{GenreID = xyz};'是一样的。 – magnattic 2011-03-17 20:11:03

+0

执行上述操作后出现错误? – Nix 2011-03-17 20:12:44

相关问题