منتج LINQ لحقلين في استعلام مجمع
سؤال
أحتاج إلى حساب مجموع منتج حقلين.سيتم استخدام هذا لمتوسط السعر المرجح.متوسط السعر = مجموع (السعر * الحجم) / مجموع (الحجم).يعرض كل من السعر 1 والسعر 2 الخطأ "الإرسال المحدد غير صالح."
var result3 = from sym in dataTableAsEnumerable()
group sym by new { symbol = sym["symbol"] } into grouped
select new
{
// SYMBOL = sym.Field<string>("symbolCAN"),
SYMBOL = grouped.Key.symbol,
tradeTimeMin = grouped.Min(e => e["tradeTimeMin"]),
tradeTimeMax = grouped.Max(e => e["tradeTimeMax"]),
volume = grouped.Sum(e => (int)e["volume"] ),
price1 = grouped.Sum(e => (double)e["volume"] * (double)e["symbol"]) / grouped.Sum(e => (double)e["volume"]),
price2 = grouped.Sum(e => ( e.Field<decimal>("volume") * e.Field<decimal>("symbol")))
};
المحلول
المشكلة التي تراها تتعلق بإخراج القيم من ملف DataRow
.يبدو الأمر كذلك volume
هو int
و symbol
هو double
, ، ولكن في خطوط الخطأ الخاصة بك، فأنت تستخدم أحدهما أو الآخر كنوع مختلف.مثال مشابه سيحاول القيام بذلك:
object o = 3.0; // double
decimal m = (decimal)o;
سيفشل هذا لأنك تحاول فتح علبة double
ك decimal
.من ناحية أخرى، هذا يعمل بشكل جيد:
object o = 3.0; // double
double d = (double)o;
decimal m = (decimal)d;
لإصلاح المثال الخاص بك، تحتاج أولاً إلى تحويل القيمة إلى النوع الصحيح، ثم الإرسال وفقًا لذلك (أو الرجوع إلى عمليات التحويل الضمنية):
...
price = grouped.Sum(e => e.Field<int>("volume") * e.Field<double>("symbol")) /
grouped.Sum(e => e.Field<int>("volume"))
...
أو باستخدام نوع مجهول لجعل التحديد النهائي أكثر قابلية للقراءة:
...
let data = grouped.Select(e => new {
Volume = e.Field<int>("volume"),
Symbol = e.Field<double>("symbol")
})
select new
{
...
price = data.Sum(x => x.Volume * x.Symbol) / data.Sum(x => x.Volume)
...
};
لا تنتمي إلى StackOverflow