2013-07-26 19 views
0

我的問題很難解決。我需要你幫助這個問題。 codefirst中有很多關係。但我無法解決這個問題。我想使用Predicate函數。但我無法解決它?如何使用「方法(謂詞func)」如何在多對多關係實體框架中使用謂詞方法linq lambda表達式?

 public int Method<T>(Predicate<T> func) 
    { 


     var s1 = this.Uow.X.GetAll().Where(func) 
         .SelectMany(a => a.OrganizationalUnits.Where(q => Identity.Y.Contains(q.Z))) 
         .GroupBy(t => t, (k, g) => new 
         { 
          Tag = k, 
          Count = g.Count() 
         }) 
         .OrderByDescending(g => g.Count); 


     var s2 = this.Uow.X.GetAll().Where(func) 
         .SelectMany(a => a.Classes.Where(q => Identity.Y.Contains(q.K))) 
         .GroupBy(t => t, (k, g) => new 
         { 
          Tag = k, 
          Count = g.Count() 
         }) 
         .OrderByDescending(g => g.Count); 


     var s3 = this.Uow.X.GetAll().Where(func) 
         .SelectMany(a => a.Courses.Where(q => Identity.Y.Contains(q.L))) 
         .GroupBy(t => t, (k, g) => new 
         { 
          Tag = k, 
          Count = g.Count() 
         }) 
         .OrderByDescending(g => g.Count); 



     return s1.ToString().Count() + s2.ToString().Count() + s3.ToString().Count(); 
    } 
+0

目前還不清楚是什麼你在這裏和你在問什麼...... –

+0

你的方法GetAll是否返回IEnumerable或IQueryable? –

回答

1

這裏是這樣做的。我也刪除了最後一行的ToString(),因爲你不需要一個對象作爲一個字符串來計算它。

這樣調用:int result = Method<TypeGoesHere>(p => p == aValue);

public int Method<T>(Expression<Func<T, Boolean>> Predicate) 
{ 


    var s1 = this.Uow.X.GetAll().Where(Predicate) 
        .SelectMany(a => a.OrganizationalUnits.Where(q => Identity.Y.Contains(q.Z))) 
        .GroupBy(t => t, (k, g) => new 
        { 
         Tag = k, 
         Count = g.Count() 
        }) 
        .OrderByDescending(g => g.Count); 


    var s2 = this.Uow.X.GetAll().Where(Predicate) 
        .SelectMany(a => a.Classes.Where(q => Identity.Y.Contains(q.K))) 
        .GroupBy(t => t, (k, g) => new 
        { 
         Tag = k, 
         Count = g.Count() 
        }) 
        .OrderByDescending(g => g.Count); 


    var s3 = this.Uow.X.GetAll().Where(Predicate) 
        .SelectMany(a => a.Courses.Where(q => Identity.Y.Contains(q.L))) 
        .GroupBy(t => t, (k, g) => new 
        { 
         Tag = k, 
         Count = g.Count() 
        }) 
        .OrderByDescending(g => g.Count); 

    return s1.Count() + s2.Count() + s3.Count(); 
} 

我想你可能想不管是什麼類型this是一個擴展方法。它看起來像這樣(如果thisTypethis的類型)。這不需要成爲模板,因爲您(但不是我)知道X.GetAll()的類型。我猜想列表<int>這將使T int。我也將代碼更改得更簡潔但具有相同的功能。 (這可能是你的原代碼做了錯誤的事情,但這樣做同樣的事情。)

這樣調用:

thisType something = new something(); 
someType aValue = X; // don't know the type here. 

// do stuff with something 

int result = something.Method(p => p == aValue); 

代碼:

public static int Method(this thisType me, Expression<Func<someType, Boolean>> Predicate) 
{ 
    var allOfEm = me.Uow.X.GetAll().Where(Predicate); 

    var s1 = allOfEm 
       .SelectMany(a => a.OrganizationalUnits.Where(q => Identity.Y.Contains(q.Z))) 
       .Distinct(); 

    var s2 = allOfEm 
       .SelectMany(a => a.Classes.Where(q => Identity.Y.Contains(q.K))) 
       .Distinct(); 

    var s3 = allOfEm 
       .SelectMany(a => a.Courses.Where(q => Identity.Y.Contains(q.L))) 
       .Distinct(); 

    return s1.Count() + s2.Count() + s3.Count(); 
} 
+0

如何調用此? – programmerist

+0

@programmerist - 我編輯了答案以顯示如何調用它。 – Hogan

相關問題