2017-09-25 81 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中测试过它,它工作。 –