2012-11-30 57 views
0

我有兩個表:baswareCatalog.FlowCurrent和baswareCatalog.Doc。 它們都包含屬性DocId。 Doc-table還具有LastExpireDate和Status屬性。 FlowCurrent-table也具有RecipientName屬性。 我想檢索Doc的集合,其中DocId的項目在兩個表中都是相同的。如何連接兩個表,並檢索使用Linq的項目集合

而且,這種情況必須是真實的:flowCurrent.RecipientName.Contains(userFullName)

我嘗試以下,但我不知道這是否是正確的。

var docitemIQueryable = from flowCurrent in baswareCatalog.FlowCurrent join 
         document in baswareCatalog.Docs on 
         flowCurrent.DocId equals document.DocId 
         where flowCurrent.RecipientName.Contains(userFullName) 
         select new 
         { 
          Items = baswareCatalog 
            .Docs 
            .Where(b => b.DocId == flowCurrent.DocId) 
         }; 

的返回值是

'interface System.Linq.IQueryable<out T>'. 
T is 'a' 
Anonymous Types: 'a is new {IQueryable<Doc> Items }' 

如何檢索文檔的集合,我可以遍歷?

回答

1

兩件事一個IQueryable:

  1. System.Linq.IQueryable是可以迭代的集合。你可以把它放在一個foreach循環或做任何你想要的。或者如果您想立即實現它,您可以使用.ToList()
  2. 你正在做額外的工作,你不需要在你的查詢中做。您正在加入FlowCurrentDocs之間的連接,但是您將獲得結果並再次返回Docs。你不需要那樣做。

假設你關心的是剛剛在Docs的東西,試試這個:

var docitemIQueryable = from flowCurrent in baswareCatalog.FlowCurrent 
         join document in baswareCatalog.Docs on 
          flowCurrent.DocId equals document.DocId 
         where flowCurrent.RecipientName.Contains(userFullName) 
         select document; 

這會給你行的集合與Docs所有字段。如果你需要一些東西在FlowCurrent還有那麼你就需要做更多的東西是這樣的:

var docitemIQueryable = from flowCurrent in baswareCatalog.FlowCurrent 
         join document in baswareCatalog.Docs on 
          flowCurrent.DocId equals document.DocId 
         where flowCurrent.RecipientName.Contains(userFullName) 
         select new { 
          document.DocId, flowCurrent.blahblah, ... 
         }; 
1

沒有更多關於表結構的知識,您的查詢看起來沒問題。在'select'的位置,你有兩個表加入並受where子句的限制。

在select new中,您可以爲新對象分配要包含的原始表中的所有屬性。

select new 
{ 
    DocId = flowCurrent.DocId, 
    LastExpireDate = document.LastExpireDate, 
    //etc 
} 

如果你只是想獲得文檔的項目,你可以做到這一點

var docitemIQueryable = from flowCurrent in baswareCatalog.FlowCurrent join 
        document in baswareCatalog.Docs on 
        flowCurrent.DocId equals document.DocId 
        where flowCurrent.RecipientName.Contains(userFullName) 
        select document; 

,然後你將有一個文件

0

結果對象序列項屬性中,所以你需要一個嵌套循環或

的SelectMany
foreach(var item in docitemIQueryable.SelectMany(x=> x.Items)){ 
    //do something 
} 

但是似乎你內心的選擇返回在這種情況下,你可以跳過匿名類型對象,只需選擇喜歡一個元素下面

select document; 

並簡化循環至

foreach(var item in docitemIQueryable){ 
    //do something 
}