2012-02-17 50 views
1

我有一個存儲過程,返回表類型。但是,具有存儲過程的EF模型僅返回當前的表類,但不返回關聯的類。所以當我遍歷我引用的(子/父)表時,我得到了那些引用表值的無處不在。linq to實體存儲過程返回,需要額外的連接後事實

我知道這是預期的存儲過程只返回該表(從該表中選擇*),但我現在想創建一個連接子句後調用存儲過程來訪問其餘的引用表在我的EF模型中。

這裏是我的代碼,稍加修改,使之易於理解我需要什麼...

var coll = db.SearchContacts(keyword,param1,param2) 
//returns Contact types,works great 

...現在我想做些什麼......(雖然我知道語法關閉)

var ExtColl = coll join db.Address on coll.Address 
       join db.Department on coll.Department <- something similar 

...所以,我現在可以訪問該部門(department.desc), 或地址(address.civic)信息從該聯繫人。

我不知道如何實現這種格式化後,我已經從數據庫中的存儲過程中得到它。


好了,這裏是我在做什麼更新...

var ps = from d in db.SearchContacts(param1,param2) 
     select d.Id; 
var p = from e in db.Contacts 
     .Include("Table1Ref") 
     .Include("Table2Ref") 
     .Include("Table3Ref") 
     Where(BuildOrExpression<DBMOdel.Contact,long>(e=>e.Id,ps.ToList())) 
     select e; 

現在我得到我想,除了一件事返回.... 有表即我想添加參考進一步參考表 ,包括不允許 我直接將它們添加到聯繫人,因爲這些表不是 引用聯繫人,但另一個表引用聯繫人 進一步一層/級別...因此聯繫人引用地址 和地址引用省... 和我需要訪問省信息(如描述) 但需要完成我的正確連接語句....

所以我想使用連接語句,但不知道分配或這種加盟語法... 聯繫 - 在AdressId,地址>地址 - >省ProvinceId

所以我想我的LINQ語句應該是這樣的......

var p = from e in db.Contacts 
     .Include("Table1Ref") 
     .Include("Table2Ref") 
     .Include("Table3Ref") 
     Where(BuildOrExpression<DBMOdel.Contact,long>(e=>e.Id,ps.ToList())) 
->  join o in db.Province on o.ProvinceId equals e.Address.ProvinceId 
     select e; 

但我沒有得到期望的效果等...任何人都可以幫忙嗎? 我想我可能也混合LINQ到SQL或LINQ到實體的對象... 這是我得到的錯誤

「調用'加入'方法的鍵選擇器類型不是在底層商店提供商中具有可比性。「

回答

2

沒有SQL語法將表連接到存儲過程,因此EF也無法執行此操作。

替代方案:

  • 不要在內存中的連接(LINQ到對象)。
  • 執行存儲過程中的連接並將其映射到complex type

後一個選項可能會執行(多)更好,但不夠靈活。衡量利弊取決於你。

+0

關於性能,第二個是最好的選擇(複雜類型)。英孚不適合所有情況,所以請打開其他選項。例如,我使用EF來保存/更新/刪除簡單對象的數據。爲了檢索數據(主/細節,計算字段,報告),我只是使用數據表,因爲性能和實際使用。 – Nathan 2012-02-18 16:55:20

+0

你能告訴我做第一個的語法嗎,因爲這是我與之有區別的......如上所述,我的迴歸坐在變量中...... var coll .....,我需要做的一個連接或包含與該表和其他表的語法.....所以我添加了一個額外的變量.... var ExtraColl =「語法來獲得我需要使用coll變量的連接」..... – 2012-02-21 15:30:45

+0

它將是一個'coll.ToList()',然後使用['join'](http://msdn.microsoft.com/en-us/library/bb882533.aspx)。但這取決於你對你的聯繫人做什麼。如果你並不總是需要所有的地址和部門信息,你可以考慮以每個聯繫人爲基礎獲取信息。 – 2012-02-22 10:45:45

相關問題