SQL 级别函数是否可用于 LINQ 到实体查询

本文关键字:LINQ 实体 查询 用于 函数 是否 SQL | 更新日期: 2023-09-27 18:34:19

我希望我可以将 LINQ 写入调用其他函数的实体查询:

from c in context.Widgets
where MyFunc(c.name)
select c

这会导致错误,因为表达式显然无法转换为调用 MyFunc 的 TSQL。

好吧,我在想,除非MyFunc是一个用户定义的函数或(我认为更好的)SQL/CLR函数。

那么这可能吗,而且推荐吗?

如果不可能,我希望拥有此功能的愿望是否有效,并且可能会在 ADO.NET 的未来得到解决?

SQL 级别函数是否可用于 LINQ 到实体查询

您应该在

数据库中创建一个用户定义的函数MyFunc,并将其手动"导入"到上下文中(EDMX,所以数据库优先),既在 XML 中,也作为上下文类之外的分部类中的存根。该过程描述如下:

如何使用自定义数据库函数(请注意,"StorageNamespace"是您在 XML 文件中找到的命名空间 <edmx:StorageModels><Schema Namespace=... 下。

MSDN 也有类似的描述。

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/