我需要在我的asp.net mvc(C#)应用程序中使用Entity Framework和LINQ查询SQL中的XML数据。
我有一个名为XMLValue
的列,其中包含数据。
<MetaData>
<Reviews>1</Reviews>
<Rating>1</Rating>
</MetaData>
我需要从xml中获取所有评分为1的客户。我参考了此stackoverflow帖子,但无法实现。
我已添加了SQL函数并将其添加到我的edmx中:
CREATE FUNCTION [dbo].[FilterCustomersByRating]
(@Rating int)
RETURNS TABLE
AS
RETURN
SELECT XMLTest.*
FROM XMLTest
CROSS APPLY XMLValue.nodes('//MetaData') N(C)
where N.C.value('Rating[1]', 'int')=@Rating
GO
以下是一个数据库相关的函数:
[DbFunction("XMLDBModel.Store", "FilterCustomersByRating")]
public static IQueryable<XMLTest> MyXmlHelper(int rating)
{
throw new NotImplementedException("You can only call this function in a LINQ query");
}
以下是我尝试的linq查询,与帖子中完全相同,但无法使用该函数并且会抛出错误。
var _dbCustomers = (from x in _context.XMLTests
where MyXmlHelper(1).Where(xh=> xh.XMLValue.Contains("1"))
select x);
错误:
Cannot implicitly convert type 'System.Linq.IQueryable<XMLTest>' to 'bool
如果我使用Any(),那么会出现以下错误:
var _dbCustomers = (from x in _context.XMLTests
where MyXmlHelper(1).Any(xh => xh.XMLValue.Contains("1"))
select x);
错误:
The specified method 'System.Linq.IQueryable`1[XMLTest] MyXmlHelper(Int32)' on the type 'CustomerRepository' cannot be translated into a LINQ to Entities store expression because its return type does not match the return type of the function specified by its DbFunction attribute.
有人能提供一下如何实现这个的建议吗?