2015-09-29 30 views
0

我有一個對象有一個計算字段;計算公式太複雜了,它必須檢查一些條件,並從另一個對象加載一些數據(必須與其他表連接)。 這是我的目標:複雜的計算列在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 
     { 

     } 
    } 

我有一些問題:

  1. 我不能使用投影,我有兩個原因:代碼的第一個可讀性和第二個是我的項目結構不允許我使用預計查詢。
  2. 我們使用數據庫第一種方法,並且此字段不在數據庫中,因爲它的計算字段。
  3. 我們處理一個大型數據庫,我不能包括(加入)我需要的所有表,所以我更願意使用SQL服務端查詢爲我計算它。
  4. 我們不能使用存儲過程或視圖,因爲我們有很多這樣的列,我們需要動態查詢動態過濾器。
  5. 查詢的性能對我們來說非常重要。

我會適當的,如果任何人都可以幫助我。

+0

那麼你的代碼目前的問題是什麼?你只是將你的問題描述爲你***不能做的事情,但是不會顯示當前代碼有任何問題。 – Hopeless

+0

我需要在SQL服務器上計算此列,並進行一次往返。 –

+0

你可以用言語放下計算的邏輯,這樣我會更容易解釋。 –

回答

0

如果我在哪裏,我添加一個視圖來計算服務器上的此字段並用於查詢此視圖。這與CQRS架構模式兼容。

+2

他不能使用他的問題中提到的觀點,它可能不是回答而是評論。 –

+0

我必須使用動態查詢和動態過濾器,所以我不能使用視圖或SP –

+0

動態過濾器和查詢的含義是什麼?它如何允許使用視圖? –