2017-09-25 4 views
-1

私は3つのモデルと1つのビューモデルを持っています。私はシリアル番号を生成しようとしていますシリアル番号を生成します。 LINQを使ったリスト

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; } 
    } 

:モデルは次のようにされていますように

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; } 
} 

私はまた、ビューモデルを持っています。 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(); 

他の項目のクエリ内でシリアル番号を増やす方法を理解できません。 ありがとうございました。

おかげで

Partha

+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++; 

あなたはまた、以下のように

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

または匿名型(C#7 ValueTupleを使用して)、元のクエリでそれを行うことができ、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

こんにちはマット、私はあなたの答えは私のコメントの実装であり、私の答えのサブセットであると信じています - そして、これは正しい方法です。なぜ私の答えが下落したのか?ありがとう! – ironstone13

+0

SerialNo = serialCount ++が機能していません。コンパイル時にエラーが発生する '式ツリーに代入演算子が含まれていない可能性があります'。だから私はSerialNo = serialCount + 1に変更しました。しかし、SerialNoは常に1です。 – Partha

+0

どのバージョンのC#を使用していますか?私はLinqPadでそれをテストし、うまくいきました。 –

関連する問題