我希望我可以编写调用其他函数的LINQ to Entity查询:
from c in context.Widgets
where MyFunc(c.name)
select c
这会导致错误,因为表达式显然无法转换为调用MyFunc的TSQL。
嗯,我在想,除非MyFunc是用户定义的函数或(我认为更好)SQL / CLR函数。
这是可能的,而且是推荐的吗?
如果不可能,我希望这个功能有效并且可能会被ADO.NET的未来解决吗?
答案 0 :(得分:3)
您应该在数据库中创建一个用户定义的函数MyFunc
并将其手动“导入”您的上下文(edmx,因此首先是数据库),在XML中以及作为部分类中的存根上下文类。该过程在此处描述:
How to use a custom database function(请注意,“StorageNamespace”是您在<edmx:StorageModels><Schema Namespace=...
下的XML文件中找到的命名空间。
MSDN也有类似的描述。
答案 1 :(得分:0)
EF倾向于将.net类与数据库的结构同步,并且最好是数据库愚蠢且所有逻辑都在类中。
但你可以映射到函数和存储过程 - 它有点技术性解释(更容易做) - 让我为你找到一些链接。
这是一个糟糕的方法:
// Query that calls the OrderTotal function to recalculate the order total.
string queryString = @"USING Microsoft.Samples.Entity;
FUNCTION OrderTotal(o SalesOrderHeader) AS
(o.SubTotal + o.TaxAmt + o.Freight)
SELECT [order].TotalDue AS currentTotal, OrderTotal([order]) AS calculated
FROM AdventureWorksEntities.SalesOrderHeaders AS [order]
WHERE [order].Contact.ContactID = @customer";
int customerId = 364;
using (AdventureWorksEntities context =
new AdventureWorksEntities())
{
ObjectQuery<DbDataRecord> query = new ObjectQuery<DbDataRecord>(queryString, context);
query.Parameters.Add(new ObjectParameter("customer",customerId));
foreach (DbDataRecord rec in query)
{
Console.WriteLine("Order Total: Current - {0}, Calculated - {1}.",
rec[0], rec[1]);
}
}
http://msdn.microsoft.com/en-us/library/dd490951.aspx
以下是如何正确执行此操作:
http://scipbe.wordpress.com/2010/08/30/stored-procedures-udfs-in-the-entity-framework-part-1/