首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.net c sharp LINQ :返回对象利用率

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

Stack Overflow用户
提问于 2009-11-16 17:40:11
回答 4查看 144关注 0票数 0

这是我的LINQ语句

代码语言:javascript
复制
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“中检索值呢?有什么想法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-11-16 17:46:57

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

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

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

代码语言:javascript
复制
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() -如果没有得到任何结果将抛出result
  • First() -如果没有获得任何结果将抛出,将忽略first
  • SingleOrDefault()之后的任何结果-如果获得多个结果将抛出,但如果没有获得any
  • FirstOrDefault()将返回null如果获得任何结果,将忽略第一个

之后的任何结果

我会建议一个调用,它将使系统在所有指示编程错误的情况下(并且仅在这些情况下)抛出。如果预期可能找不到产品(例如,用户输入了ID),那么假设Id是主键,那么SingleOrDefault()可能是合适的。你会写道:

代码语言:javascript
复制
OrderProductMapping mapping = query.SingleOrDefault();

然后根据mapping是否为空做出适当的反应。

EDIT:对注释做出反应,最简单的方法是使用匿名类型,获取查询结果,然后从中构建所需的结果类型:

代码语言:javascript
复制
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执行进程中的投影:

代码语言:javascript
复制
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)
                       });
票数 4
EN

Stack Overflow用户

发布于 2009-11-16 17:44:36

您可以按如下方式枚举Query的结果:

代码语言:javascript
复制
foreach(OrderProductMapping result in Query)
{
    ...
}
票数 1
EN

Stack Overflow用户

发布于 2009-11-16 17:46:18

代码语言:javascript
复制
foreach(var item in Query)
{
    Console.Writeline(item.OrderId);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1741095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档