.net c sharp LINQ:返回对象利用率

时间:2009-11-16 09:40:11

标签: c# .net linq

这是我的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。

但是从变量“查询”如何检索值? 任何的想法 ?

4 个答案:

答案 0 :(得分:4)

首先,您可以通过删除末尾的“into x select x”来简化查询。只需将其留在select new ...部分即可。您还可以删除where子句中的括号。

我还建议使用ProductPrice和ProductAmount的简单强制转换 - 特别是在解析之前将产品价格转换为字符串对我来说是个坏主意。首先是PriceQuantity的类型是什么?

最后,将范围变量名称设为单数通常是个好主意,因为它一次只应用于一个项目:

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)
{
   ...
}
编辑:殴打!哎呀!