2009年4月29日星期三

LinqToSql异常:"you can't new an Entity in a query"

下面这段代码执行的时候就会抛出标题中提到的异常:

public Product GetProduct(int productId)
{
var product = (from p in dbContext.Products
where p.ProductID == productId
select new Product { Name = p.Name, ListPrice = p.ListPrice, ProductID = p.ProductID }
).Single();
return product;
}


原因在于我们在查询语句的最后执行了一个创建新的Product的方法,这就是异常中提到的new entity的意思。在query中我们并不是不能创建对象的实例,而是不能创建“实体”的实例,在linq to sql中实体指的就是与数据库表对应的那个对象,比如这里的Product

为了验证这一点,我们将Product换成别的类,比如ProductData:

public ProductData GetProduct(int productId)
{
var product = (from p in dbContext.Products
where p.ProductID == productId
select new ProductData {
Name = p.Name,
ListPrice = p.ListPrice,
ProductID = p.ProductID
}).Single();
return product;
}

这样就没问题了,query可以正常执行。ProductData类是我们自定义的类,用作DataContract,不是linq to sql的建模工具从数据库生成的。

[DataContract]
public class ProductData
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int ProductID { get; set; }
[DataMember]
public decimal ListPrice { get; set; }
}
所以,如果你得到这个异常,不妨检查看看你的query语句里是否包含了“实体”。