2017-04-11 17 views
0

如何加入兩個表,並獲得基於B類變量的記錄值如何在LINQ採取()方法中使用條件

Class A 
{ 
    RecordID int {get;set;} 

    Name string {get;set;} 
} 

Class B 
{ 
    Name string {get;set;} 

    DataToPick int {get;set;} 
} 

我的輸入是

Class A 
--------------------- 
RecordID name 

1  Sathish 

2  Sathish 

3  Kumar 

4  Kumar 

5  Ajay 

Class B 
-------------------------------------- 
Name DataToPick 

Sathish 1 

kumar  2 

現在我想加入兩個表,並從A類獲得值,即3個記錄,基於B類變量(Datatopick)

請幫忙寫下如下的LINQ

var qry= (from c in classA 
      join d in ClassB on c.name equals d.name 
     select c).take(d.datatopick) 
+0

'd.datatopick'不一個記錄,在這裏我可以看到'1,2',你會考慮哪一個 –

回答

1

您可以將ClassA組合起來,然後從另一個列表中選擇DataToPick

var result = 
    classA.GroupBy(a => a.Name) 
      .SelectMany(g => g.Take(classB.Where(b => b.Name == g.Key) 
             .Select(b => b.DataToPick) 
             .DefaultIfEmpty(0) 
             .Single())); 

更妙的是加入第一和看法:

var result = classA.Join(classB, a => a.Name, b => b.Name, (a, b) => new {a, b.DataToPick}) 
        .GroupBy(arg => new {arg.a.Name, arg.DataToPick}) 
        .SelectMany(g => g.Select(arg => arg.a).Take(g.Key.DataToPick)); 
+0

Datatopick是從A級挑選的所有匹配記錄的數目m classA.name = ClassB.name – sathish

+0

對不起,我完全誤解了你之前。我已編輯以反映您的真實問題。 –

+0

我已經驗證過該功能正確 –

1

你可以join ClassA和ClassB的,由Name, DataToPick組,並使用Take

(from a in listA 
join b in listB on a.Name equals b.Name 
group new { a, b } by new { a.Name, b.DataToPick } into gr 
select new 
{ 
    Name = gr.Key.Name, 
    ListA = gr.Select(x=>x.a).Take(gr.Key.DataToPick) 
} 
).SelectMany(x => x.ListA).ToList(); 
+0

這提供了正確的結果 –