你應該可以在一個循環中用幾個LINQ表達式相對容易地做到這一點。
例如,假設你有一個Item
類是這樣的:
public class Item
{
public int Id { get; set; }
public int Rev { get; set; }
}
而且人的名單:要在批量查詢List<Item> Items;
。在一批中,不會出現Id
多次。
您可以Distinct
很容易得到的第一個查詢:
var queryItems = Items.Distinct(new ItemIdComparer()).ToList();
和你比較器:
public class ItemIdComparer: IEqualityComparer<Item>
{
public int Equals(Item x, Item y)
{
return x.Id == y.Id;
}
public int GetHashCode(Item x)
{
return x.Id;
}
}
但是現在你需要那些遺留下來的物品。對於這一點,你需要一個相等比較,是以修訂進去,太:
public class ItemComparer: IEqualityComparer<Item>
{
public int Equals(Item x, Item y)
{
return x.Id == y.Id && x.Rev == y.Rev;
}
public int GetHashCode(Item x)
{
// not the best hash code, but should work okay.
return x.Id^x.Rev;
}
}
並獲得了在原來的列表中,但不是在不同的列表中,你叫Enumerable.Except的項目清單:
var leftover = Items.Except(queryItems, new ItemComparer()).ToList();
如果你把它放在一個循環,你可以這樣做反覆,直到leftover
列表爲空:
var workingItems = Items.ToList();
while (workingItems.Count > 0)
{
var queryItems = workingItems.Distinct(new ItemIdComparer()).ToList();
var leftover = workingItems.Except(queryItems, new ItemComparer()).ToList();
DoQuery(queryItems);
workingItems = leftover;
}
使用這種算法,可以Ø只需兩次查詢即可獲得所有物品的信息。第一個會得到項目1.1,2.1,3.3,4.2和5.1。第二個查詢將得到1.2和3.5。
什麼的底層技術LINQ是映射? –
@CapTec沒有用於查詢後端的Linq提供程序,查詢之前的對象是純內存類型和自定義類型,基本上客戶端API僅爲int,[.Id和.Revision值。因此,在批量最少的情況下批量處理內存,在本地進行。 –
您可以從唯一標識符中生成一棵樹,每個分支下的每個修訂版都有節點。這樣,您可以在每個節點需要時查詢您的api。 (認爲以說話的方式流式傳輸您的查詢)。雖然我可能會誤解你的問題。我已經完成了與XML類似的操作,以便在運行內存時保持其內存佔用低,同一個主體可能用於查詢API。 –