无法将System.Linq.IQueryable <anonymoustype#1>类型隐式转换为System.Linq.IQueryable <anonymoustype#2>

时间:2016-03-15 18:11:46

标签: entity-framework linq asp.net-mvc-4

当我将所有内容都放在一个语句中时,我的查询非常有效:

var rs = db.SerialNumbers
  .Join(db.ProductLines, sn => sn.ProductLineId, pl => pl.Id, (sn, pl) => new { pl.Id, pl.Category, sn.UserId })
  .Where(sn => sn.UserId == userId)
  .Select(sn => new { sn.Id, sn.Category })
  .Distinct();

但是我需要为UserId添加条件。我只想过滤userId中的条目,即userId&gt;所以我改为查询:

 var rs = db.SerialNumbers
   .Join(db.ProductLines, sn => sn.ProductLineId, pl => pl.Id, (sn, pl) => new { pl.Id, pl.Category, sn.UserId });

  if(userId > 0)
  {
    rs = rs.Where(sn => sn.UserId == userId);
  }

  rs = rs.Select(sn => new { sn.Id, sn.Category });

我在编译时收到此错误:

  

无法将类型System.Linq.IQueryable<AnonymousType#1>隐式转换为   System.Linq.IQueryable<AnonymousType#2>

我该怎么办?

1 个答案:

答案 0 :(得分:5)

您的加入计划:

(sn, pl) => new { pl.Id, pl.Category, sn.UserId }

但你最后的任务是:

sn => new { sn.Id, sn.Category }

他们不是同一类型,因此问题。

如果查询实际上已经是你想要的形状,最简单的解决方法就是使用两个不同的变量:

var query = db.SerialNumbers
              .Join(db.ProductLines,
                    sn => sn.ProductLineId,
                    pl => pl.Id,
                    (sn, pl) => new { pl.Id, pl.Category, sn.UserId });
if (userId > 0)
{
      query = query.Where(sn => sn.UserId == userId);
}
var results = query.Select(sn => new { sn.Id, sn.Category });