Mục tiêu của tôi là lấy mức trung bình có trọng số từ một bảng, dựa trên một khóa chính của bảng khác.Tính trung bình có trọng số với LINQ
Ví dụ dữ liệu:
Table1
Key WEIGHTED_AVERAGE
0200 0
Table2
ForeignKey Length Value
0200 105 52
0200 105 60
0200 105 54
0200 105 -1
0200 47 55
tôi cần để có được một bình quân gia quyền dựa vào độ dài của một phân đoạn và tôi cần phải bỏ qua các giá trị là -1 . Tôi biết làm thế nào để làm điều này trong SQL, nhưng mục tiêu của tôi là làm điều này trong LINQ. Nó trông giống như thế này trong SQL:
SELECT Sum(t2.Value*t2.Length)/Sum(t2.Length) AS WEIGHTED_AVERAGE
FROM Table1 t1, Table2 t2
WHERE t2.Value <> -1
AND t2.ForeignKey = t1.Key;
Tôi vẫn còn khá mới đối với LINQ, và có một thời gian khó khăn để tìm ra cách dịch. Kết quả trọng số trung bình nên đi ra khoảng 55,3. Cảm ơn bạn.
Cảm ơn, rất hữu ích. Tôi vết thương lên làm cho điều này một lớp lót ... công cộng tĩnh float WeightedAverage (IEnumerable mục này, Func giá trị, Func trọng lượng) { các mặt hàng hoàn trả.Sum (item => value (item) * weight (item))/items.Sum (trọng lượng); } –
josefresno
Tôi phải thêm "Nếu weightedSum.AlmostZero() trả về 0" sau khi tính toán để bảo vệ chống phân chia bằng không khi tất cả trọng số và hoặc tất cả các giá trị bằng không. AlmostZero là một chức năng mở rộng kiểm tra nếu một đôi là số không. – derdo