【发布时间】:2013-06-10 22:10:08
【问题描述】:
我想组合三个 LINQ 查询。每个查询都有不同的 where 条件,但 group by 和 select 子句始终遵循相同的模式。非常感谢任何帮助!
查询 1:
var querySales = from row in bookings.AsEnumerable()
where (row.Field<Int32>("t-account") >= tAccSalesFrom && row.Field<Int32>("t-account") <= tAccSalesTo)
group row by new
{
year = row.Field<DateTime>("Date").Year,
month = row.Field<DateTime>("Date").Month
} into grp
orderby grp.Key.year, grp.Key.month
select new
{
Year = grp.Key.year,
Month = grp.Key.month,
Sales = grp.Sum(row => row.Field<Decimal>("Sales_Assets") - row.Field<Decimal>("Sales_Debit"))
};
查询 2:
var queryLabourCosts = from row in bookings.AsEnumerable()
where (row.Field<Int32>("t-account") >= tAccLabFrom && row.Field<Int32>("t-account") <= tAccLabTo)
group row by new
{
year = row.Field<DateTime>("Date").Year,
month = row.Field<DateTime>("Date").Month
} into grp
orderby grp.Key.year, grp.Key.month
select new
{
Year = grp.Key.year,
Month = grp.Key.month,
LabourCosts = grp.Sum(row => row.Field<Decimal>("Sales_Debit") - row.Field<Decimal>("Sales_Assets"))
};
查询 3:
var queryMaterial = from row in bookings.AsEnumerable()
where (row.Field<Int32>("t-account") >= tAccMatFrom && row.Field<Int32>("t-account") <= tAccMatTo)
group row by new
{
year = row.Field<DateTime>("Date").Year,
month = row.Field<DateTime>("Date").Month
} into grp
orderby grp.Key.year, grp.Key.month
select new
{
Year = grp.Key.year,
Month = grp.Key.month,
MaterialCosts = grp.Sum(row => row.Field<Decimal>("Sales_Debit") - row.Field<Decimal>("Sales_Assets"))
};
解决方案:感谢lazyberezovsky!
var querySalesLabMat = from b in bookings.AsEnumerable()
group b by new
{
b.Field<DateTime>("Date").Year,
b.Field<DateTime>("Date").Month,
} into g
orderby g.Key.Year, g.Key.Month
select new
{
g.Key.Year,
g.Key.Month,
Sales = g.Where(r => r.Field<Int32>("t-account") >= tAccSalesFrom && r.Field<Int32>("t-account") <= tAccSalesTo)
.Sum(r => r.Field<Decimal>("Sales_Assets") - r.Field<Decimal>("Sales_Debit")),
LabourCosts = g.Where(r => r.Field<Int32>("t-account") >= tAccLabFrom && r.Field<Int32>("t-account") <= tAccLabTo)
.Sum(r => r.Field<Decimal>("Sales_Debit") - r.Field<Decimal>("Sales_Assets")),
MaterialCosts = g.Where(r => r.Field<Int32>("t-account") >= tAccMatFrom && r.Field<Int32>("t-account") <= tAccMatTo)
.Sum(r => r.Field<Decimal>("Sales_Debit") - r.Field<Decimal>("Sales_Assets"))
};
提前感谢您的帮助, 垫子
【问题讨论】:
-
看起来像 Find 10 Difference 游戏:)
-
很有可能通过如此复杂的查询,您无意中将计算逻辑从 SQL 服务器(我怀疑您使用了一个)移动到客户端计算机,这反过来又会导致巨大的内存消耗并且查询执行明显延迟(直到 SQL 服务器中的所有表都将下载到您的计算机内存中)。
-
这是因为并非所有 SQL 操作在 Linq 操作中都有对应的操作,如果在您的复杂表达式树的中间,至少会有一个没有 SQL 类比 - 这将是触发器强制编译器生成代码以从 SQL 获取数据到本地内存并在其上运行查询运算符。
-
@Sevenate 是 LINQ to DataSet - 他已经拥有客户端上的所有数据
-
@lazyberezovsky 那么这是有道理的,同意。
标签: c# linq group-by sum where