2017-06-10 35 views
1

我有類似LINQ實體請求:LINQ實體類似的代碼

ComdataFuelDetailVM model = (from i in db.ComdataFuels 
           where i.ID == id.Value 
           select new ComdataFuelDetailVM() 
           { 
            ID = i.ID, 
            CardNo = i.CardNo, 
            City = i.City, 
            CompanyId = i.CompanyId, 
            DriverId = i.DriverId, 
            DriverName = i.DriverName, 
            EmployeeNo = i.EmployeeNo, 
            Fees = i.Fees, 
            GalPrice = i.GalPrice, 
            NoOfGal = i.NoOfGal, 
            OwnerOp = i.OwnerOp, 
            PayoutRebate = i.PayoutRebate, 
            Rebate = i.Rebate, 
            State = i.State, 
            TotalCost = i.TotalCost, 
            TransDate = i.TransDate, 
            TransTime = i.TransTime, 
            TruckNo = i.TruckNo, 
            TruckStopCode = i.TruckStopCode, 
            TruckStopInvoiceNo = i.TruckStopInvoiceNo, 
            TruckStopName = i.TruckStopName, 
            UnitNo = i.UnitNo 
           }).FirstOrDefault(); 


ComdataFuelDeleteVMmodel = (from i in db.ComdataFuels 
           where i.ID == id.Value 
           select new ComdataFuelDeleteVM() 
           { 
            ID = i.ID, 
            CardNo = i.CardNo, 
            City = i.City, 
            CompanyId = i.CompanyId, 
            DriverId = i.DriverId, 
            DriverName = i.DriverName, 
            EmployeeNo = i.EmployeeNo, 
            Fees = i.Fees, 
            GalPrice = i.GalPrice, 
            NoOfGal = i.NoOfGal, 
            OwnerOp = i.OwnerOp, 
            PayoutRebate = i.PayoutRebate, 
            Rebate = i.Rebate, 
            State = i.State, 
            TotalCost = i.TotalCost, 
            TransDate = i.TransDate, 
            TransTime = i.TransTime, 
            TruckNo = i.TruckNo, 
            TruckStopCode = i.TruckStopCode, 
            TruckStopInvoiceNo = i.TruckStopInvoiceNo, 
            TruckStopName = i.TruckStopName, 
            UnitNo = i.UnitNo 
           }).FirstOrDefault(); 

ComdataFuelDetailVM和ComdataFuelDeleteVM具有相同的屬性(但用作視圖模型不同的視圖):

public abstract class ComdataFuelAbstractVM 
{ 
    public int ID { get; set; } 
    public int? CompanyId { get; set; } 

    public string TruckNo { get; set; } 
    public int? DriverId { get; set; } 

    [Display(Name = "Date")] 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")] 
    public DateTime TransDate { get; set; } 

    public string TransTime { get; set; } 
    public string DriverName { get; set; } 
    public string UnitNo { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string TruckStopCode { get; set; } 
    public string TruckStopName { get; set; } 
    public string TruckStopInvoiceNo { get; set; } 
    public decimal? NoOfGal { get; set; } 

    [DisplayFormat(DataFormatString = "{0:C3}")] 
    public decimal? GalPrice { get; set; } 

    [DisplayFormat(DataFormatString = "{0:c}")] 
    public decimal? TotalCost { get; set; } 

    [DisplayFormat(DataFormatString = "{0:c}")] 
    public decimal? Fees { get; set; } 

    [DisplayFormat(DataFormatString = "{0:c}")] 
    public decimal? Rebate { get; set; } 

    [Display(Name = "Rebate")] 
    [DisplayFormat(DataFormatString = "{0:c}")] 
    public decimal? PayoutRebate { get; set; } 
    public string CardNo { get; set; } 
    public string EmployeeNo { get; set; } 
    public bool? OwnerOp { get; set; } 
} 

public class ComdataFuelDetailVM : ComdataFuelAbstractVM 
{ 

} 

public class ComdataFuelDeleteVM : ComdataFuelAbstractVM 
{ 

} 

任何想寫的方法,它返回像這樣的表達式:

private Expression<Func<ComdataFuel, T>> GetPictureExpression<T>() 
{ 
    Expression<Func<ComdataFuel, T>> projection = i => 
     new T() 
     { 
      ID = i.ID, 
      CardNo = i.CardNo, 
      City = i.City, 
      CompanyId = i.CompanyId, 
      DriverId = i.DriverId, 
      DriverName = i.DriverName, 
      EmployeeNo = i.EmployeeNo, 
      Fees = i.Fees, 
      GalPrice = i.GalPrice, 
      NoOfGal = i.NoOfGal, 
      OwnerOp = i.OwnerOp, 
      PayoutRebate = i.PayoutRebate, 
      Rebate = i.Rebate, 
      State = i.State, 
      TotalCost = i.TotalCost, 
      TransDate = i.TransDate, 
      TransTime = i.TransTime, 
      TruckNo = i.TruckNo, 
      TruckStopCode = i.TruckStopCode, 
      TruckStopInvoiceNo = i.TruckStopInvoiceNo, 
      TruckStopName = i.TruckStopName, 
      UnitNo = i.UnitNo 
     }; 
    return projection; 
} 

,但我不能創建T類型的對象......

回答

2
private Expression<Func<ComdataFuel, T>> GetPictureExpression<T>() where T: ComdataFuelAbstractVM, new() 

創建你需要添加新的()約束

2

如果ComdataFuelDetailVM和ComdataFuelDeleteVM具有相同的屬性,然後只寫常用的接口或基類包含了所有這些特性,這些類和你的方法使用這種結構:

private Expression<Func<ComdataFuel, T>> GetPictureExpression<T>() where T : ICommonInterface 
+0

這不是一個規則噸。這些類可以有不同的超類,但具有相同的屬性...此外,如果類有一點區別(即一個屬性)等,我想有一個靈活的解決方案。 –

+0

因此,只爲他們使用通用接口,而不是普通的超類。通用接口將包含這些類共享的所有屬性,並允許按照我提供的方式編寫通用方法 –

+0

接口將增加子類並增加添加/刪除新屬性的難度。 –