0

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

主要问题是,因为我正在转向这个框架,所以应用程序的许多结构都基于空字符串和负 -1 等特性,如果你试图在 LINQ / EF 之前将其变为 null将其保存到数据库中,无需任何条件逻辑。

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

考虑到这一点,我不能围绕处理 Null 而不是空字符串/-1 等来改变整个系统。我需要编写一种循环遍历 LINQ 表类中的属性的方法,我从选择中提取数据并将 null 转换为我需要的所需值,例如:

string name = null, to string name = ""

我知道我可以使用反射和循环使用这种风格,但从我所读到的,使用它的时间成本相当昂贵,特别是当它会被合理地经常使用时,所以我相信唯一的选择是写作使用委托的东西,虽然我都非常不确定如何准确地使用委托(以前从未使用过或接触过它们),以及如何为我的问题实现它,但我确实听说过使用类型字典来对付委托,但我我不确定它是如何工作的。

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

4

1 回答 1

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但这应该没什么大不了的。

编辑:我忘了提到的一个缺点是您不能在 Linqwhere子句中使用附加属性。另一种方法是将计算列直接添加到表中,或者使用带有额外列的视图。然后您只需要在上面的属性上定义set(而不是get)。

于 2013-11-07T12:40:44.383 回答