从查询

时间:2017-10-26 20:13:45

标签: c# linq

我试图从连接查询中返回一个列表并且遇到错误。

这是我的代码:

public IList<UniStock.Domain.Tables.Inventory> SelectInventoryListByColourSizeGroup(string styleColour, string sizeGroup)
    {
        var db = new UniStockContext();

        IQueryable<Domain.Tables.Inventory> q = (from c in db.Inventories
                   join o in db.SizeGroupSizes
                   on c.Size.Trim() equals o.Description.Trim()
                   where (c.SytleColour == styleColour)
                   && (o.SizeGroup.Description == sizeGroup)
                   select new
                   {
                       c
                   });

        return q;
    }

我现在看到的错误是:

  

无法隐式转换类型System.Linq.IQueryable&#39;到System.Linq.IQueryable&#39;。存在显式转换(您是否错过了演员?)`

3 个答案:

答案 0 :(得分:4)

问题是,正如错误所说,当您的方法期望特定类型时,您无法返回匿名类型。通过使用新的{}语法,您将创建一个匿名类型。只需删除新的{}

即可
public IList<UniStock.Domain.Tables.Inventory> SelectInventoryListByColourSizeGroup(string styleColour, string sizeGroup)
{
    var db = new UniStockContext();

    IQueryable<Domain.Tables.Inventory> q = (from c in db.Inventories
               join o in db.SizeGroupSizes
               on c.Size.Trim() equals o.Description.Trim()
               where (c.SytleColour == styleColour)
               && (o.SizeGroup.Description == sizeGroup)
               select c);

    return q.ToList();
}

答案 1 :(得分:3)

LINQ表达式的这一部分

select new { c } ;

将为您提供匿名类型对象的列表。您的方法签名表示它应该返回IList<Inventory>。由于您没有返回预期的类型,因此您将收到此编译时错误。

您选择的应该只是c,这是db.Inventories的别名(尽管有过滤器)

var q =  from c in db.Inventories
               join o in db.SizeGroupSizes
                  on c.Size.Trim() equals o.Description.Trim()
                 where (c.SytleColour == styleColour)
                   && (o.SizeGroup.Description == sizeGroup)
               select c;
return q.ToList();

变量q将为IQueryable<Inventory>,当您调用ToList()时,它将执行LINQ表达式并将获得List<Inventory>并且您将返回该值,这是与您的方法签名(IList<Signature>

匹配

答案 2 :(得分:1)

您通过这样做投射到新的AnonymousType

select new { c }

你可能想要的是像这样选择对象:

select c

然后,您需要在末尾追加.ToList()以执行查询并填充列表。