生成序列号。在List中使用LINQ

时间:2017-09-25 19:26:54

标签: c# entity-framework linq

我有三个模型和一个View模型。模型如下:

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查询作为列表执行时。稍后此列表将显示为序列号为no的表。 我写了以下查询。

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

我无法理解如何在查询中增加其他项目的序列号。 感谢您的帮助。

由于

帕塔

2 个答案:

答案 0 :(得分: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(); 

答案 1 :(得分:-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 } }