實體框架不支持帶有TVP的存儲過程。但是,支持表值函數,但它不是一回事。爲了達到類似的結果,我所要做的就是改變參數的數據類型並使用xml。然後我寫了一個TVF來讀取xml並返回一個表加入。
假設你傳遞一個XML這樣的:
<列表> <ID/ID> < /列表>
create function [dbo].[XMLToTable] (@xml xml)
returns table
as
return (
--get the ids from the xml
select Item.value('.', 'int') as id from @xml.nodes('//id') as T(Item)
)
,你的選擇會是這樣
select t.* from MyTable t
inner join dbo.XMLToTable(@myXmlParam) x on x.id = t.id
EF會將此視爲一個字符串參數,並且您只需傳遞它即可。這是相對較快的,因爲它使用內聯表值函數。不幸的是,它是EF決定支持TVP之前的一種解決方法。
請在此給予好評的功能要求: http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/status/317789
編輯: 這裏是你如何處理多個值稍微複雜的例子:
declare @xml xml =
'
<complex>
<companies>
<id>123456</id>
<name>My Company</name>
</companies>
<companies>
<id>147889</id>
<name>Some Co</name>
</companies>
</complex>
'
declare @tbl table (id int, name varchar(50))
insert into @tbl values (123456, 'My Company'),
(147889, 'Some Co'),
(788545, 'Great Corp')
select * from @tbl co
left join dbo.XMLCompanies(@xml) x on x.id = co.id
create function [dbo].[XMLCompanies] (@xml xml)
returns table
as
return (
--get the ids from the xml
select
id=Item.value('./id[1]', 'int')
,name=Item.value('./name[1]', 'varchar(50)')
from @xml.nodes('//companies') as T(Item)
)
您可以將對象轉換爲一個DataTable使用[CopyToDataTable](http://msdn.microsoft.com/en-us/library/bb396189(v = vs.110).aspx),然後使用SqlCommand調用存儲過程,如[使用帶EF的TVPs]中所示( http://stackoverflow.com/questions/19545835/using-sql-table-valued-parameter-with-entity-framework) –
https:// stackoverflow.com/questions/13601366/entityframework-and-tablevalued-parameter –