这是我的LINQ语句
var Query = from products in pLDataContex.Products
where (products.Id == p)
select new OrderProductMapping
{
OrderId = insertedOrderId,
ProductId = p,
ProductPrice = Convert.ToInt32(products.Price.ToString()),
ProductQuantity = products.Quantity,
ProductAmount = Convert.ToInt32(products.Price * products.Quantity)
} into x
select x;我尝试做的是从Product表中获取一些细节(比如价格和数量),并创建一个OrderProductMapping对象,这样我就可以在应用程序中使用该对象的user letter。
但是如何从变量"Query“中检索值呢?有什么想法吗?
发布于 2009-11-16 17:46:57
首先,您可以通过删除末尾的"into x select x“来简化查询。只需将其留在select new ...部分。您还可以删除where子句中的括号。
我还建议对ProductPrice和ProductAmount进行简单的强制转换--特别是在解析之前将产品价格转换为字符串对我来说不是一个好主意。首先,Price和Quantity的类型是什么?
最后,将范围变量名单一化通常是一个好主意,因为它一次只应用于一项:
var query = from product in pLDataContex.Products
where product.Id == p
select new OrderProductMapping
{
OrderId = insertedOrderId,
ProductId = p,
ProductPrice = (int) product.Price,
ProductQuantity = product.Quantity,
ProductAmount = (int) (product.Price * products.Quantity)
};现在,Query将被输入为IEnumerable<OrderProductMapping>。你期待一个单一的结果吗?如果是这样,请使用以下选项之一:
Single() -如果没有得到任何结果将抛出resultFirst() -如果没有获得任何结果将抛出,将忽略firstSingleOrDefault()之后的任何结果-如果获得多个结果将抛出,但如果没有获得anyFirstOrDefault()将返回null如果获得任何结果,将忽略第一个之后的任何结果
我会建议一个调用,它将使系统在所有指示编程错误的情况下(并且仅在这些情况下)抛出。如果预期可能找不到产品(例如,用户输入了ID),那么假设Id是主键,那么SingleOrDefault()可能是合适的。你会写道:
OrderProductMapping mapping = query.SingleOrDefault();然后根据mapping是否为空做出适当的反应。
EDIT:对注释做出反应,最简单的方法是使用匿名类型,获取查询结果,然后从中构建所需的结果类型:
var query = from product in pLDataContex.Products
where product.Id == p
select new
{
OrderId = insertedOrderId,
ProductId = p,
ProductPrice = (int) product.Price,
ProductQuantity = product.Quantity,
ProductAmount = (int) (product.Price * product.Quantity)
};
var anonMapping = query.SingleOrDefault();
if (anonMapping != null)
{
OrderProductMapping mapping = new OrderProductMapping
{
OrderId = anonMapping.OrderId,
ProductId = anonMapping.ProductId,
ProductPrice = anonMapping.ProductPrice,
ProductQuantity = anonMapping.ProductQuantity,
ProductAmount = anonMapping.ProductAmount
};
}请注意,这不会有一般的实体行为-如果修改映射,则必须显式地保存对数据库的任何更改。不过,在这种情况下,我不认为这是一个问题。
另一种选择是使用AsEnumerable执行进程中的投影:
var query = pLDataContex.Products
.Where(product => product.Id == p)
.AsEnumerable()
.Select(product => new OrderProductMapping
{
OrderId = insertedOrderId,
ProductId = p,
ProductPrice = (int) product.Price,
ProductQuantity = product.Quantity,
ProductAmount = (int) (product.Price *
product.Quantity)
});发布于 2009-11-16 17:44:36
您可以按如下方式枚举Query的结果:
foreach(OrderProductMapping result in Query)
{
...
}发布于 2009-11-16 17:46:18
foreach(var item in Query)
{
Console.Writeline(item.OrderId);
}https://stackoverflow.com/questions/1741095
复制相似问题