2012-01-24 134 views
1

在一个项目中,我有一个LINQ to SQL类,它是OrderingSystem.dbml。我有以下代码,并且在select语句中,我只想从每个表中检索一些行(产品 - 类别)。但是,当然,我现在的回归声明是不正确的。什么是正确的返回语句使用?在此先感谢LINQ to SQL返回语句


    OrderingSystemDataContext database = new OrderingSystemDataContext(); 

    public List<Product> GetProductsByCategoryID(int CategoryID) 
    { 
     var result = from p in database.Products 
     join c in database.Categories 
     on p.CategoryID equals c.CategoryID 
     where p.CategoryID == CategoryID 
     select new { p.ProductName, p.ProductPrice, p.ProductDescription, c.CategoryName }; 

     //This is not working 
     return result.ToList(); 
    } 
+1

你是不是指什么意思? –

+0

@ DanielA.White从Visual Studio的确切错误是“不能隐式转换类型'System.Collections.Generic.List '到'System.Collections.Generic.List '” –

+0

您是否甚至需要一个where子句给你加入这些相同的列?同样在where子句中,第二个CategoryID看起来不明确。 – radarbob

回答

1

在选择新的,你必须指定类型,如果你再要检索的产品清单,现在它创建一个匿名类型。尝试更改:

OrderingSystemDataContext database = new OrderingSystemDataContext(); 

public List<Product> GetProductsByCategoryID(int CategoryID) 
{ 
    var result = from p in database.Products 
    join c in database.Categories 
    on p.CategoryID equals c.CategoryID 
    where p.CategoryID == CategoryID 
    //Assuming that these are the names of your properties 
    select new Product(){ProductName = p.ProductName, ProductPrice = p.ProductPrice, ProductDescription = p.ProductDescription, CategoryName = c.CategoryName }; 

    return result.ToList(); 
} 
+0

我在构建项目时没有收到任何错误,但是当我尝试调用wcf服务时,它会这样说:不允许在查询中显式构造实体类型'OrderingSystemWebServices.Product'。 –

0

您的返回类型是Product,但您的查询结果使用匿名类型。

改变这一行:

select new { p.ProductName, p.ProductPrice, p.ProductDescription, c.CategoryName }; 

到这样的事情:

select new Product { Name = p.ProductName, Price = p.ProductPrice, Description = p.ProductDescription, Category = c.CategoryName }; 

编辑:

select p; 
+0

我在构建项目时没有收到任何错误,但是当我尝试调用wcf服务时,它会这样说:不允许在查询中显式构造实体类型'OrderingSystemWebServices.Product'。 –

0

这是因为:

尽量只用替换它LINQ表达式,你做了一个select new { }它创建一个匿名对象,而你的方法返回一个列表Product。您应该更改select语句,使其成为select new Product() { ProductName = p.ProductName, ...其余部分取决于Product类的结构。

0

通过使用“选择新的”LINQ操作,您正在创建一个匿名类型。您可以在对象创建的当前范围内访问该匿名类型的属性,但不能使用任何可识别的类型返回该匿名类型。你有两个选择:

  1. 创建一个新类(例如产品),并创建该类型的实例为您的select语句的一部分(如其他答案指示)
  2. 返回集合为List<object>。如果你这样做,你仍然可以从对象中检索值,但是你需要通过反射来完成。如果您将集合用作数据绑定场景中的数据源,这可能非常有效。