簡體   English   中英

生成序列號在列表中使用 LINQ

[英]Generate serial no. in List using 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();

我無法理解如何使用其他項目在查詢中增加序列號。 謝天謝地,任何幫助都會被接受。

謝謝

帕塔

編輯:這是一個應該更好的替代解決方案

    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(); 

為什么不簡單地迭代結果並使用計數器設置?
你有多少元素? 你關心性能嗎?

你面臨什么困難?

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)] }

或匿名類型,嘗試使用 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 } }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM