在ASP.NET MVC中传递匿名类型

时间:2009-07-08 20:28:09

标签: c# asp.net-mvc linq-to-sql

我正在使用带有C#的ASP.net MVC。为什么这是代码:

public IQueryable<Product> ListProducts(string prodcutType)
{
    var results = from p in db.Products
        join s in db.Stocks
        on p.ID equals s.IDProduct
        where p.ptype == prodcutType
        select new { s.width, s.height, s.number};                 
    return results;
}

显示以下错误?

  

错误1无法隐式转换类型   System.Linq.IQueryable<AnonymousType#1>   至   System.Linq.IQueryable<eim.Models.Product>。   存在显式转换(是你   错过演员?)

2 个答案:

答案 0 :(得分:8)

因为select new { s.width, s.height, s.number}表示System.Linq.IQueryable<AnonymousType#1>,但您的函数希望返回IQueryable<Product>。将您的代码更改为:

public IQueryable<Product> ListProducts(string prodcutType)
{

    var results = from p in db.Products
                  join s in db.Stocks
                  on p.ID equals s.IDProduct
                  where p.ptype == prodcutType
                  select p;
    return results;
}

<强>更新:

或许你想要IQueryable<Stock>

public IQueryable<Stock> ListProducts(string prodcutType)
{

    var results = from p in db.Products
                  join s in db.Stocks
                  on p.ID equals s.IDProduct
                  where p.ptype == prodcutType
                  select s;
    return results;
}

如果只想要3个属性width + height + number,则创建新类型。例如:

public class SomeType {
    public int Width { get; set; }
    public int Height { get; set; }
    public int Number { get; set; }
}

public IQueryable<SomeType> ListProducts(string prodcutType)
{

    var results = from p in db.Products
                  join s in db.Stocks
                  on p.ID equals s.IDProduct
                  where p.ptype == prodcutType
                  select new SomeType {
                      Width = s.width,
                      Height = s.height,
                      Number = s.number
                  };
    return results;
}

答案 1 :(得分:1)

LINQ查询的最后一行

select new { s.width, s.height, s.number};     

将只从表“db.Stocks”中选择这三个字段,这将创建一个新的匿名类型,它将存储在“结果”中并传回。

你在“返回结果”中传回的内容;声明因此不是一个IQueryable<Product> - 这是完全不同的东西(即匿名类型的IQueryable)。

如果您想退回产品,则需要将该匿名类型转换为“产品”(或从所选字段中创建新产品类)。

马克