I am trying to import SQL Server’s CONTAINS() function in my Entity Framework model so that I can use it in my LINQ queries.
I have added this to my EDM:
<Function Name="FullTextSearch" ReturnType="Edm.Boolean">
<Parameter Name="Filter" Type="Edm.String" />
<DefiningExpression>
CONTAINS(*, Filter)
</DefiningExpression>
</Function>
Add created my method stub:
[EdmFunction("MyModelNamespace", "FullTextSearch")]
public static bool FullTextSearch(string filter)
{
throw new NotSupportedException("This function is only for L2E query.");
}
I try to call the function like this:
from product in Products
where MyModel.FullTextSearch("FORMSOF(INFLECTIONAL, robe)")
select product
The following exception is raised:
The query syntax is not valid. Near term '*'
I realize that the function I defined is not directly linked to the entity set being queried so that could also be a problem.
Is there any way to pull this off?
The function you have defined above uses Entity SQL, not Transact SQL, so I think the first step is to figure out whether CONTAINS(*,’text’) can be expressed in Entity SQL.
Entity SQL doesn’t support the * operator as described here: http://msdn.microsoft.com/en-us/library/bb738573.aspx and if I try
I get the same error you got above. If I try to explicitly pass the column it works:
But when I look at the SQL it translated it to a LIKE expression.
If you cannot express the query using Entity SQL you’ll have to use a Stored Procedure or other mechanism to use Transact SQL directly.