我正在转向LINQ和实体框架(虽然我不确定EF是否会影响我的问题)与SQL Server 2005相关,我从数据库中提取并将输出存储在它所定义的类中在模型中。
主要的问题是因为我正在转向这个框架,应用程序的很多结构是基于空字符串和负-1的特性,在LINQ / EF之前它们会变成null。你试图将它保存到DB而没有任何条件逻辑。
但是,使用LINQ / EF,它们将作为这些值插入,因此需要逻辑在插入之前将空字符串转换为Null,反之亦然,以便选择/读取(至少我知道) ,我还没有找到在LINQ中定义自动将特定值转换为Null的方法。
考虑到这一点,我无法改变整个系统来处理Null而不是空字符串/ -1等。我需要编写一种循环LINQ表类中的属性的方法。我从select中提取数据并将null转换为我需要的值,例如:
string name = null, to string name = ""
我知道我可以使用反射和循环使用那种风格,但从我所看到的它使用起来相当昂贵的时间成本,特别是当它经常被合理使用时,所以我相信只有选项是使用委托写一些东西,虽然我非常不确定如何准确地使用委托(以前从未使用或触摸它们),以及如何为我的问题实现它,我确实听到提到使用类型字典对代表,但我不确定它是如何工作的。
总结一下,是否有一种方法我很容易在插入/更新时轻松将空字符串和其他定义的值转换为null,以及在select上执行相反的操作,或者有人可以解释如何使用委托来实现这个? (或者我错误地认为反思通常效率很低?)
答案 0 :(得分:2)
我不确定我是否正确理解了您的问题,但假设您正在使用从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
,但这不应该是一个大问题。
编辑:我忘了提到的一个缺点是你不能在Linq where
子句中使用其他属性。另一种方法是将计算列直接添加到表中,或者使用带有额外列的视图。然后,您只需要在上面的属性中定义set
(而不是get
)。