Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net Linq到Sql-具有父表关系的双分组依据_Asp.net_Linq_Linq To Sql - Fatal编程技术网

Asp.net Linq到Sql-具有父表关系的双分组依据

Asp.net Linq到Sql-具有父表关系的双分组依据,asp.net,linq,linq-to-sql,Asp.net,Linq,Linq To Sql,我在获取linq到sql查询时遇到问题,不知道是否有人可以帮助我。我有以下表格:“订单”、“订单产品”、“产品”和“用户”。我想获得每个“用户”订购了多少产品(按ProductID包含在“OrderProducts”中)的细分计数。用户的用户ID包含在“Orders”表中,“OrderProducts”orderID与“Orders”中的orderID相关。最终结果应如下所示: User1 User2 User3 Product1 100 75 17

我在获取linq到sql查询时遇到问题,不知道是否有人可以帮助我。我有以下表格:“订单”、“订单产品”、“产品”和“用户”。我想获得每个“用户”订购了多少产品(按ProductID包含在“OrderProducts”中)的细分计数。用户的用户ID包含在“Orders”表中,“OrderProducts”orderID与“Orders”中的orderID相关。最终结果应如下所示:

User1 User2 User3 Product1 100 75 17 Product2 24 78 18 Product3 82 48 35 用户1用户2用户3 产品1100 75 17 产品2 2478 18 产品3 82 48 35 因此,它根据UserID和ProductID进行分组,并根据该UserID获取所有分组的ProductID的数量之和。我希望这是有道理的。非常感谢您的帮助,谢谢

下面是一个简化的数据库分解:
产品
-ProductID
-产品名称

订单
-医嘱ID
-用户ID

订购产品
-医嘱ID
-ProductID
-产品数量

用户
-用户ID

用户名

>P>如果您在数据库中建立了适当的关系(因此,在DBML中),您可能需要考虑这样的(未测试的):


很明显,您会希望更改标记和某些对象类型,但我希望这能让您继续。我尽量使用自动生成的类对象结构,以避免创建不可读的LINQ查询。

这里的查询将为您提供
用户
产品
计数的列表:

from op in OrderProducts
group op by new {op.Order.User, op.Product} into g
select new
{
  g.Key.User.UserName,
  g.Key.Product.ProductName,
  Count=g.Sum(op => op.ProductQty)
}
它不会以您想要的确切格式为您提供结果,但它只会使用Linq为您提供大部分结果

还要注意,这不会提取任何额外的数据-(
用户
产品
,计数为0)。这可能是你想要的,也可能不是

[编辑] 下面是另一个要查看的查询(实际上有两个):


按原样,这会给您直接的结果(产品名称、用户名、数量表)。注释掉的部分将改为按产品分组,产品(取决于您呈现结果的方式)可能是您想要的。

您要求的结果形状称为轴。它具有数据驱动的列,而不是在查询运行之前声明的列

这里的诀窍是将结果投影到一个类型中,其中“属性”在运行时可能会发生变化。我做过类似的事情

以下是针对您的特定问题的一个尝试:

// grab relationally-shaped results from database
var queryResult = 
(
  from u in myDataContext.Users
  from o in u.Orders
  from op in o.OrderProducts
  select new
  {
    UserName = u.UserName,
    ProductName = op.ProductName,
    Quantity = op.Quantity
  }
).ToList()

// now use a LinqToObjects query to pivot
List<XElement> pivotedResults =
(
  from x in queryResult
  group by x.ProductName into g
  select new XElement(g.Key,
    from y in g
    group by y.UserName into subg
    select new XAttribute(subg.Key, subg.Sum(z => z.Quantity))
).ToList();
//从数据库中获取关系型结果
变量queryResult=
(
来自myDataContext.Users中的u
从美国订单中的o开始
从o.OrderProducts中的op
选择新的
{
用户名=u.UserName,
ProductName=op.ProductName,
数量=操作数量
}
)托利斯先生()
//现在使用LinqToObjects查询来透视
列出数据透视结果=
(
来自queryResult中的x
按x.ProductName分组到g
选择新元素(g键,
从y到g
按y.UserName分组到subg中
选择新的XAttribute(subg.Key,subg.Sum(z=>z.Quantity))
).ToList();

问题似乎在于,它会为每个用户的每个产品运行一个单独的查询。如果有2500个产品和500个用户,那么访问数据库的次数将达到125万次……你需要等待一天的结果。嗯,这看起来很有希望,但我还没有机会对其进行太多修改。我如何将其修改为rE归零?(即用户已订购此产品0次)。最后,我将指定要在结果中包含哪些产品和用户,因此我必须将这些产品和用户作为0。不过,感谢您!另外,请告诉我是否有人有清理我的查询的提示!嘿,谢谢!我正在进行另一个项目,刚刚回到这个项目。不过,我必须在VB.NET中执行此项目,我只有一个将linq语句转换为vb.net时出现问题。我不知道I.Sum(v=>v)将转换为什么。到目前为止,我已经得到了:产品中的p来自用户中的u让I=(来自订单产品中的op,其中op.Order.User.UserID=u.UserID和op.Product.ProductID=p.ProductID选择op.ProductQty)\如果(i.Count()=0,0,i.Sum())\选择带有{p.ProductName,u.Username,Qty}的New。非常感谢Ryan!使用
i.Sum(函数(v)v))
而不仅仅是
i.Sum()
。请确保查看组的使用情况(注释掉的部分)以防它更符合你的需要。太棒了!非常感谢,我想你现在已经回答了我的一些问题,我应该雇佣你,哈哈!万分感谢!
from op in OrderProducts
group op by new {op.Order.User, op.Product} into g
select new
{
  g.Key.User.UserName,
  g.Key.Product.ProductName,
  Count=g.Sum(op => op.ProductQty)
}
from p in Products
from u in Users
let i = (from op in OrderProducts
         where op.Order.User == u && op.Product == p
         select op.ProductQty)
let quant = i.Count() == 0 ? 0 : i.Sum(v=>v)
select new {p.ProductName, u.UserName, Quantity = quant}
//group new {u.UserName, Quantity = quant} by p into g
//select new {g.Key.ProductName, Users = g.AsEnumerable()}
// grab relationally-shaped results from database
var queryResult = 
(
  from u in myDataContext.Users
  from o in u.Orders
  from op in o.OrderProducts
  select new
  {
    UserName = u.UserName,
    ProductName = op.ProductName,
    Quantity = op.Quantity
  }
).ToList()

// now use a LinqToObjects query to pivot
List<XElement> pivotedResults =
(
  from x in queryResult
  group by x.ProductName into g
  select new XElement(g.Key,
    from y in g
    group by y.UserName into subg
    select new XAttribute(subg.Key, subg.Sum(z => z.Quantity))
).ToList();