2017-09-25 35 views
-1

我有三個模型和一個View模型。該模型是這樣的:生成序列號。在列表中使用LINQ

public partial class SalesDetail 
    { 
     public long IID { get; set; } 
     public Nullable<long> SalesId { get; set; } 
     public int ItemId { get; set; } 
     public int UoM { get; set; } 
     public int Qty { get; set; } 
     public Nullable<decimal> Disc { get; set; } 

     public virtual General General { get; set; } 
     public virtual Item Item { get; set; } 
     public virtual Sale Sale { get; set; } 
    } 

public partial class Item 
    { 
       public Item() 
     { 
      this.SalesDetails = new HashSet<SalesDetail>(); 
     } 

     public int IID { get; set; } 
     public string Item1 { get; set; } 
     public int UoM { get; set; } 

     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
     public virtual ICollection<SalesDetail> SalesDetails { get; set; } 
    } 



    public partial class General 
     { 
      public General() 
      { 
       this.Parties = new HashSet<Party>(); 
       this.Parties1 = new HashSet<Party>(); 
       this.SalesDetails = new HashSet<SalesDetail>(); 
      } 

      public int IID { get; set; } 
      public string Value { get; set; } 
      public string Desciption { get; set; } 
      public byte Type { get; set; } 
      public Nullable<int> ParentID { get; set; } 
} 

我也有一個像視圖模型:

public class SalelsDetailListViewModel 
    { 
     public int SerialNo { get; set; } 
     public Int64 Id { get; set; } 
     public int ItemId { get; set; } 

     public string ItemName { get; set; } 

     public int UoM { get; set; } 

     public string UnitName { get; set; } 

     public int Qty { get; set; } 

     public decimal? Disc { get; set; } 
    } 

我試圖生成序列號。同時執行linq查詢作爲列表。稍後,此列表將顯示爲序列號爲的表格。 我寫了下面的查詢。

lstDetails = (from d in db.SalesDetails 
            join i in db.Items on d.ItemId equals i.IID 
            join u in db.Generals on d.UoM equals u.IID 
            select new SalelsDetailListViewModel 
                     { 
             SerialNo = ???, 
             Id = d.IID, 
             ItemId = i.IID, 
             ItemName = i.Item1, 
             UoM = u.IID, 
             UnitName = u.Value, 
             Qty = d.Qty, 
             Disc = d.Disc 
            }).ToList(); 

我不明白如何增加與其他項目的查詢內序列號。 任何幫助將被感謝接受。

感謝

帕塔

+1

就在你聲明'lstDetails'之前,你可以聲明'int count = 0'並且執行'SerialNo = count ++' 但是如果你在運行中生成它,你將如何使用那個串行?對於你的客戶來說,這是沒有意義的,如果有人在視圖中看到它並將其發回,你將如何將它與你的數據相匹配? – ironstone13

+0

我已經嘗試過,但序列號總是0. – Partha

+0

我已經測試了我的建議,它的工作原理。我在下面的答案中提供了一些替代方案。讓我知道,如果它不適合你,我們會找出原因。 – ironstone13

回答

-1

爲什麼不能簡單地遍歷結果和使用計數器設置?
你有幾個元素?你關心性能嗎?

你面臨什麼困難?

var counter = 0; 
foreach (var x in lstDetails) x.SerialNo = counter++; 

你也可以做它在原來的查詢,如下圖所示(使用C#7 ValueTuple)

var sample = new [] { "a", "b", "c" }; 
var count = 0; 
sample.Select(x => (x, count++)).ToList(); 
// result 
// List<ValueTuple<string, int>>(3) { [(a, 1)], [(b, 2)], [(c, 3)] } 

或匿名類型,try with Fiddle

var sample = new [] { "a", "b", "c" }; 
var count = 0; 
sample.Select(x => new { x, c = count++ }).ToList(); 
// result 
// List<<>f__AnonymousType0#8<string, int>>(3) { \{ x = "a", c = 1 }, \{ x = "b", c = 2 }, \{ x = "c", c = 3 } } 
1

編輯:這是一種更好的替代解決方案

var lstDetails = (from d in salesDetailsList 
         join i in itemList on d.ItemId equals i.IID 
         join u in generalList on d.UoM equals u.IID 
         select new 
         { 
          Id = d.IID, 
          ItemId = i.IID, 
          ItemName = i.Item1, 
          UoM = u.IID, 
          UnitName = u.Value, 
          Qty = d.Qty, 
          Disc = d.Disc 
         }) 
         .Select((s, index) => new SalesDetailListViewModel() 
         { 
          SerialNo = index, 
          Id = s.Id, 
          ItemId = s.ItemId, 
          ItemName = s.ItemName, 
          UoM = s.UoM, 
          UnitName = s.UnitName, 
          Qty = s.Qty, 
          Disc = s.Disc 
         }).ToList(); 
+0

嗨馬特,我相信你的回答是我的評論的實施,也是我答案的一個子集,也是 - 這是做到這一點的正確方法。任何想法爲什麼我的答案是downvoted?謝謝! – ironstone13

+0

SerialNo = serialCount ++不起作用。獲取編譯時錯誤'表達式樹可能不包含賦值運算符'。所以我將它改爲SerialNo = serialCount + 1。但SerialNo總是1. – Partha

+0

您使用的是什麼版本的C#?我在LinqPad中測試過它,它工作。 –