Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.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# 如何有效地将空值转换为依赖于类型的特定值?_C#_.net_Sql_Linq_Delegates - Fatal编程技术网

C# 如何有效地将空值转换为依赖于类型的特定值?

C# 如何有效地将空值转换为依赖于类型的特定值?,c#,.net,sql,linq,delegates,C#,.net,Sql,Linq,Delegates,我将转向使用SQL Server 2005的LINQ和实体框架(尽管我不确定EF是否会影响我的问题),我从数据库中提取并将输出存储在它从模型中包含的表中定义的类中 主要的问题是,因为我要讨论这个框架,所以应用程序的很多结构都是基于诸如空字符串和负-1之类的特性,如果您试图在没有任何条件逻辑的情况下将其保存到DB中,那么在LINQ/EF之前,这些特性将变为null 但是,使用LINQ/EF时,它们将作为这些值插入,因此在插入之前需要逻辑将空字符串转换为null,反之亦然,用于选择/读取(至少据我所

我将转向使用SQL Server 2005的LINQ和实体框架(尽管我不确定EF是否会影响我的问题),我从数据库中提取并将输出存储在它从模型中包含的表中定义的类中

主要的问题是,因为我要讨论这个框架,所以应用程序的很多结构都是基于诸如空字符串和负-1之类的特性,如果您试图在没有任何条件逻辑的情况下将其保存到DB中,那么在LINQ/EF之前,这些特性将变为null

但是,使用LINQ/EF时,它们将作为这些值插入,因此在插入之前需要逻辑将空字符串转换为null,反之亦然,用于选择/读取(至少据我所知,我还没有找到在LINQ中定义自动将特定值转换为null的方法)

考虑到这一点,我不能改变整个系统处理空字符串而不是空字符串/-1之类的。我需要编写一种方法,在我从select中拉入数据的LINQ table类中循环属性,并将null转换为我需要的必需值,例如:

string name = null, to string name = ""
我知道我可以使用反射和循环来使用这种风格,但从我所读到的来看,使用它的时间成本相当高,特别是当它被合理地经常使用时,因此我相信唯一的选择是使用委托编写一些东西,尽管我和我都非常不确定如何准确地使用委托(以前从未使用过或接触过它们),以及如何在我的问题上实现它,我确实听到有人提到对委托使用类型词典,但我不确定这到底是如何工作的


总而言之,我是否缺少一种方法,可以在插入/更新时轻松地将空字符串和其他定义的值转换为null,并在选择时执行相反的操作,或者有人可以解释如何使用委托来实现这一点?(或者我是否错误地认为反射通常效率很低?)

我不确定是否正确理解了您的问题,但假设您使用的是从EDMX(数据库优先方法)自动生成的类,则可以使用部分定义扩展这些类,并在其中添加转换逻辑

例如,假设您有一个
Clients
表,其中列为
Id int
Name varchar(100)
,EDMX自动生成一个
Client
类,其属性为
Id
Name
。在一个单独的文件(Clients_Ext.cs)中,您可以有:

// same namespace as the auto-generated class
public partial class Client
{
    public string MyName
    {
        get { return Name ?? ""; }
        set { Name = (value == "" ? null : value); }
    }
}
以此类推。在代码的其余部分,您必须小心使用
MyName
而不是
Name
,但这应该不是什么大问题


EDIT:我忘了提到的一个缺点是不能使用Linq
where
子句中的附加属性。另一种方法是直接将计算列添加到表中,或使用具有附加列的视图。然后只需定义
(而不是
get
)在上述属性上。

简单的方法是在数据库中设置适当的数据约束。如果字段可以为NULL,那么EF模型也支持NULL。例如,问题是-数据库外部的逻辑将空字符串视为NULL,但如果在使用LINQ/EF的insert中传递空字符串,则会插入一个空字符串这是一个空字符串,不是空字符串。这会导致问题,因此我需要它将insert上的这些空字符串解释为空字符串。在EF之前您是如何处理问题的?EF不应该更改任何内容,除非您也将DTO用作域对象(糟糕)。这实际上是应用程序的问题,或者更确切地说,是数据层的问题,而不是EF的问题。要么在生成的DTO中进行转换,要么修改您自己的DTO来进行转换。我不确定,因为它是在我处理它之前设置的,所以实际上对我来说有点黑盒(目前)我猜代码可能是在C#中有可为null的int之前编写的。当时在应用程序中使用-1并在数据访问层将其转换为null是一个合理的解决方案。这就是我的意思,是的。感谢您的帮助,这似乎比我认为必须解决的问题要好得多it@user2964655例如我加了一张便条我仍然很难明白这是怎么回事,但那可能是我的大脑在转圈圈。要么你的db列可以为null,那么你的EF模型将具有null属性,这样你就可以将EF模型对象的属性设置为null,要么db列不可以为null,然后如何设置呢他的解决方案有效吗?谢谢,这不应该是个问题,在自动生成的类中,在集合中有像“ReportPropertyChange(“ID”);”这样的调用,需要复制到新的集合函数吗?还是不会被覆盖?@Wim Ombelets列可以为null,并且可以存储空字符串而不是null(当预期为空时)这最终会弄乱logic@user2964655:您的分部类只是将代码添加到自动生成类中。它不会删除或隐藏(只要您使用新名称)任何自动生成的内容。请保持您的附加属性简单,让它们依赖自动生成代码完成所有繁重的工作,这样您就可以了。