I need to use Entity Framework, LINQ to query the XML data from the SQL in my asp.net mvc(C#) application.
I have a column XMLValue
with data
<MetaData>
<Reviews>1</Reviews>
<Rating>1</Rating>
</MetaData>
I need to get all the Customers
who have a Rating
of 1 from the xml. I have referred to this stackoverflow post and I am not able to achieve it.
I have added the SQL function and added it to my 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
And the following DB function:
[DbFunction("XMLDBModel.Store", "FilterCustomersByRating")]
public static IQueryable<XMLTest> MyXmlHelper(int rating)
{
throw new NotImplementedException("You can only call this function in a LINQ query");
}
Below is the linq query which I tried exactly as in the post, but not able to use the function and it throws error.
var _dbCustomers = (from x in _context.XMLTests
where MyXmlHelper(1).Where(xh=> xh.XMLValue.Contains("1"))
select x);
Error:
Cannot implicitly convert type 'System.Linq.IQueryable<XMLTest>' to 'bool
If I user Any(), I have the following error:
var _dbCustomers = (from x in _context.XMLTests
where MyXmlHelper(1).Any(xh => xh.XMLValue.Contains("1"))
select x);
Error:
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.
Can someone suggest on how to achieve this please?
sql-server
tag to make this clear. If not: what database system is this for? – marc_s Jun 14 at 10:36"You can only call this function in a LINQ query"
? – Typist Jun 15 at 14:06