2013-11-25 60 views
-1

如果可能,我需要將此代碼轉換爲一個請求。將LINQ請求(查詢)轉換爲一個無foreach請求

foreach (var obj in objs) 
{ 
    if (obj.cars.Count > maxCars) 
    { 
     var count = obj.cars.Count - maxCars; 
     var cars = _carDao.GetQueryable() 
          .Where(v => v.obj.Id == obj.Id) 
          .OrderByDescending(v => v.CreatedDate) 
          .Take(count); 
    } 
} 

我有問題count。我可以使用這個請求:

var ids = objs.Select(p=>p.Id); 
var cars = _carDao.GetQueryable().Where(v => ids.Contains(v.obj.Id)); 

但我有不同的計數。

+1

你對當地的'count'和'cars'做了什麼?最後一個符合'obj.cars.Count> maxCars'的項目將覆蓋任何其他以前的任務 –

回答

0

也許:

var query = objs 
    .Where(o => o.cars.Count > maxCars) 
    .SelectMany(o => _carDao.GetQueryable() 
     .Where(v => v.obj.Id == o.Id) 
     .OrderByDescending(v => v.CreatedDate) 
     .Take(o.cars.Count - maxCars)); 

雖然我不知道爲什麼你需要查詢兩個來源。

+0

也許'.Where(v => o.obj.Id == v.Id)'? – user2889383

+0

@ user2889383:不,相反:'.Where(v => v.obj.Id == o.Id)'。但你說得對,我錯誤地從兩邊的'o'中選擇了。 –

+0

@ user2889383'o.Id'中的'o'來自'SelectMany',而不是'Where'。 –

0

每當你看到自己正在執行一個查詢,然後對於每個項目對另一個查詢進行單一來源以某種方式「匹配」當前項目時,這是一個標誌,您應該使用Join操作(這不適用只對LINQ,但幾乎任何關係數據庫的使用)。

var query = from obj in objs 
    join car in _carDao.GetQueryable() 
    on obj.Id equals car.obj.Id into cars 
    select new 
    { 
     obj, 
     cars = cars.OrderByDescending(v => v.CreatedDate) 
      .Take(obj.cars.Count - maxCars), 
    } 
+0

我錯過了'Where',除了你回答似乎比我更好。至少它更有效率。 –

+0

@TimSchmelter我沒有看到第一個「Where」的需求。這意味着你正在取一個負數,所以得到的集合大小爲零。如果它實際上存在很重要,那麼它可以被添加進去。如果不知道如何使用它,很難說什麼是正確的。 – Servy

+0

我看到了這個需求,因爲它是'foreach'中的第一個'if'。 –

相關問題