这是我的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对象,这样我就可以在Application中使用该对象的Value to user letter。
但是从变量“查询”如何检索值? 任何的想法 ?
答案 0 :(得分:4)
首先,您可以通过删除末尾的“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)
};
现在,查询将输入IEnumerable<OrderProductMapping>
。你期待一个结果吗?如果是这样,请使用以下方法之一:
Single()
- 如果没有得到一个结果,则会抛出First()
- 如果没有得到任何结果会抛出,会在第一次之后忽略任何结果SingleOrDefault()
- 如果获得多个结果将抛出,但如果没有任何结果则返回null FirstOrDefault()
- 如果获得任何结果将返回null,将忽略第一个我建议一个调用,它会使系统抛出指示编程错误的所有情况(只有情况)。如果预计可能找不到产品(例如,用户已输入ID),那么SingleOrDefault()
可能是合适的,假设Id
是主键。你写的是:
OrderProductMapping mapping = query.SingleOrDefault();
然后根据mapping
是否为空来做出适当的反应。
编辑:对评论做出反应,最简单的方法是使用匿名类型,获取查询结果,然后从中构建所需的结果类型:
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)
});
答案 1 :(得分:1)
您可以像这样枚举Query
的结果:
foreach(OrderProductMapping result in Query)
{
...
}
答案 2 :(得分:1)
foreach(var item in Query)
{
Console.Writeline(item.OrderId);
}
答案 3 :(得分:1)
foreach(var item in Query)
{
...
}
编辑:殴打!哎呀!