Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以在LINQ to实体查询中使用强制转换吗?_C#_Sql Server_Entity Framework_Linq_Entity Sql - Fatal编程技术网

C# 我可以在LINQ to实体查询中使用强制转换吗?

C# 我可以在LINQ to实体查询中使用强制转换吗?,c#,sql-server,entity-framework,linq,entity-sql,C#,Sql Server,Entity Framework,Linq,Entity Sql,我有一个LINQ到实体的查询 From item In ctx.Items Select new { ListPrice = item.Cost / (1M - item.Markup) }; 我可以向EF指定我希望它在查询和具体化it1之前对标价应用转换吗?是否有类似EntityFunctions的东西。可能是Cast?或者我可以使用ESQL cast函数吗 我希望LINQ沿着这些行生成SQL查询 SELECT cast((Cost / (1 - Markup)) as decima

我有一个LINQ到实体的查询

From item In ctx.Items
Select new {
    ListPrice = item.Cost / (1M - item.Markup)
};
我可以向EF指定我希望它在查询和具体化it1之前对标价应用转换吗?是否有类似EntityFunctions的东西。可能是Cast?或者我可以使用ESQL cast函数吗

我希望LINQ沿着这些行生成SQL查询

SELECT cast((Cost / (1 - Markup)) as decimal(10, 2)) AS ListPrice

1我的目标是消除一系列查询的精度/规模。因为有十进制的减法和除法,所以数学结果是十进制38,26!这超出了.NET的处理能力,也超出了我的需要。

EF允许您使用属性将CLR函数映射到数据库函数。不幸的是,看起来内置的cast和convert不是函数,而且您也无法映射到它们

相反,您可以创建一个执行强制转换的UDF,并将其映射到DbModel中。映射API很复杂,所以我会使用库为您完成它。如果您首先使用数据库或模型,则可以在SSDL和CSDL1中手动进行映射。此外,在UDF中没有办法进行动态转换,因此您需要为每个转换选择编写单独的函数。这里有一个castfield的例子,是小数10,4

-在SQL Server中 创建函数ClrRound_10_4 @数值小数点28,10 返回小数10,4 像 开始 声明@converted decimal10,4 选择@converted=castround@value,4为小数点10,4 返回@converted 终止 去
1有关详细信息,请参阅本文。

您不能使用转换成员吗?@AmitKumarGhosh Convert.ToDecimal不被EF识别。我知道的唯一函数是来自。这些函数中不存在您的强制转换。您是否尝试了EntityFunctions?例如EntityFunctions.Truncateitem.Cost/1M-item.Markup,2:请参阅@RaphaëlAlthaus Truncate不会更改返回值的比例/精度。它实际上将其转换为SQL Server循环。
//In your DbContext class
using CodeFirstStoreFunctions;

public class MyContext : DbContext {
    protected override void OnModelCreating(DbModelBuilder builder) {
        builder.Conventions.Add(new FunctionsConvention("dbo", typeof(Udf));
    }

    //etc
}

//In a static class named Udf (in the same namespace as your context)
using System.Data.Entity;

public static class Udf {
    [DbFunction("CodeFirstDatabaseSchema", "ClrRound_10_4")]
    public static decimal ClrRound_10_4(decimal value) {
        throw new InvalidOperationException("Cannot call UDF directly!");
    }
}

//In your LINQ query
from item in ctx.Items
select new {
    ListPrice = Udf.ClrRound_10_4(item.Cost / (1M - item.Markup))
};