我有一個對象有一個計算字段;計算公式太複雜了,它必須檢查一些條件,並從另一個對象加載一些數據(必須與其他表連接)。 這是我的目標:複雜的計算列在EF
public class LoadAndExitPermit : Master, IColorSource
{
private int? _ladingBillId;
[DataMember]
public virtual int? LadingBillID
{
get { return _ladingBillId; }
set { SetPropertyValue(ref _ladingBillId, value, "LadingBillID"); }
}
.
. {lots of Properties)
.
[DataMember]
public virtual ICollection<LoadAndExitPermitDocumentDetail> LoadAndExitPermitDocumentDetails { get; set; }
我的目標的重要組成部分,是SumGoodsUnitPrice,它是:
[NotMapped, DataMember]
Public decimal? SumGoodsUnitPrice
{
get
{
if (LoadAndExitPermitDetails == null || !LoadAndExitPermitDetails.Any())
{
return -1;
}
if (LoadAndExitPermitDetails.First().RequestDetail.OrderDetail == null)
{
decimal? sum = 0m;
foreach (var item in LoadAndExitPermitDetails)
{
decimal? tarrif = item.Good.GoodsTariffDetails.Where(g =>
g.Price > 0 && g.IsActive == true && g.GoodsTariff.GoodsTariffType.IsPublic == true && g.GoodsTariff.FromDate < Date)
.OrderByDescending(w => w.GoodsTariff.FromDate).Select(c => c.Price).FirstOrDefault();
if (tarrif != null)
{
sum += ((item.Quantity ?? 0) * (1.09m * (tarrif))) ?? 0m;
}
else
{
decimal? lastTariff = item.Good.GoodsTariffDetails.Where(x => x.Price > 0 && x.IsActive == true
&& x.GoodsTariff.FromDate < Date).OrderByDescending(w => w.GoodsTariff.FromDate).Select(c => c.Price).FirstOrDefault() ?? 0m;
sum += ((item.Quantity ?? 0) * (1.09m * (lastTariff))) ?? 0;
}
}
return sum;
}
var z = LoadAndExitPermitDetails.Sum(l => (l.Quantity ?? 0) * (1.09m * (l.RequestDetail.OrderDetail.Quantity == 0 ? 0 : (l.RequestDetail.OrderDetail.Price/l.RequestDetail.OrderDetail.Quantity) ?? 0)));
return z;
}
private set
{
}
}
我有一些問題:
- 我不能使用投影,我有兩個原因:代碼的第一個可讀性和第二個是我的項目結構不允許我使用預計查詢。
- 我們使用數據庫第一種方法,並且此字段不在數據庫中,因爲它的計算字段。
- 我們處理一個大型數據庫,我不能包括(加入)我需要的所有表,所以我更願意使用SQL服務端查詢爲我計算它。
- 我們不能使用存儲過程或視圖,因爲我們有很多這樣的列,我們需要動態查詢動態過濾器。
- 查詢的性能對我們來說非常重要。
我會適當的,如果任何人都可以幫助我。
那麼你的代碼目前的問題是什麼?你只是將你的問題描述爲你***不能做的事情,但是不會顯示當前代碼有任何問題。 – Hopeless
我需要在SQL服務器上計算此列,並進行一次往返。 –
你可以用言語放下計算的邏輯,這樣我會更容易解釋。 –