2009-09-16 40 views
2
Dim query = (From p in Parent _ 
      select _ 
       p.ID, _ 
       Tags = String.Join("|", p.Child.Select(Function(c) c.Tag.TagName).ToArray)).Take(100) 

在上面的查詢,使用採取時限制返回的行,單獨的SQL查詢的每一行返回「標籤」字段來執行。如果我刪除Take(100),將一個查詢發送到Sql Server。LinqToSql - 限制性的行數時防止子查詢返回

那麼,如何限制返回的行數,同時防止爲每行執行新的子查詢呢?

回答

2

EDIT2 當使用嵌套類型的工作,這樣一來新{R,r.childrenCollection},LINQ翻譯這(SELECT TOP 100從r),刪除加入信息。當你自己進行連接時,這不會發生。所以像這樣:

 var thingyWithChilds 
      = (from p in dc.RightCategories 
       join r in dc.Rights on p.Id equals r.CategoryId 
       select new { p.Id, r }); 

     var bla = thingyWithChilds.Take(100); 

不會導致相同的問題。

可能適用

其他的東西,你做的ToArray的(),這導致查詢執行,因爲它不是一個IQueryable的。在做Take()之後做ToArray()。

編輯根據這一話題SO:Is there a LINQ equivalent of string.Join(string, string[]),既不可能,如果你想要做的服務器上的所有使用的string.join,因爲沒有可用的SQL命令來做到這一點在TSQL。

+0

爲什麼它沒有Take()?如果使用ToList()替換Take以執行查詢,則只會生成一個SQL查詢! – 2009-09-16 08:58:30

+0

由於Take是必須在SQL服務器上執行的其他操作。 query-thats-already-partial-executed.ToList()。取(100),將生成1個查詢; query-thats-already-partial-executed.Take(100).ToList()將生成其他查詢。 – 2009-09-16 09:21:17

+0

好的,但似乎仍無法解決我的原始問題。即使刪除toArray(例如,更改爲簡單p.Child)也會導致相同的行爲。 – 2009-09-16 09:32:39