将Y / N属性映射到布尔值而不断开链接到实体

时间:2018-02-04 22:44:09

标签: .net entity-framework-6 linq-to-entities

好的,我正在使用OLD SQL数据库,这个数据库已经足够大了,原本你无法索引位字段。 所以我有一堆表,其中包含Y / N单个字段。

我终于有机会将事情转移到C#和实体框架中。

能够将它们“转换”为前端的布尔字段真的很方便。 但是当我这样做时,我在查询时将Linq分解为实体。

e.g。

db.Carriers.Where(x => x.ActiveBool)去世。

db.Carriers.ToList()。其中​​(x => x.ActiveBool)没有。  但显然,没有回溯到SQL等等。

是否可以使用其中一种(或其他聪明/方便的)

  1. 执行属性映射以将字段视为bool
  2. 做一个“适当的”新属性我可以使用
  3. 在我可以调用的对象上添加一个方法,该方法不会将Linq破坏为实体

2 个答案:

答案 0 :(得分:1)

这里有几个选项。如果可以,您可以更新数据库以获得Computed字段,然后您可以这样查询。

您可以为IsActive创建一个[NotMapped]属性:

[NotMapped]
public bool IsActive 
{ 
    get { return Active == 'Y'; } 
    set { Active = value ? 'Y' : 'N'; } 
}

然后你可以制作" Active"字段内部使其指向数据库但仅适用于模型上的此IsActive列。

但是,对于实际过滤此字段,您必须使用计算列,查看或转换从上面传入的IsActive布尔过滤器到' Y'或者' N'否则,你可以做一些棘手的表达式的东西,为你做这个转换,但我不认为这是值得的那种努力。辅助方法可能会这样做。

char check = Helper.ConvertBoolToChar(entity.IsActive) (returns 'Y' or 'N')
...Where(a => a.Active == check)

答案 1 :(得分:0)

行。我想我至少得到了部分解决方案。

添加到(例如Units类)

       public static System.Linq.Expressions.Expression<Func<Units, bool>> IsActive = x => ("Y".Equals(x.Active, StringComparison.OrdinalIgnoreCase)) && 
(x.Carriers == null || "Y".Equals(x.Carriers.Active, StringComparison.OrdinalIgnoreCase));

然后过滤

   l = l.Where(Data.Units.IsActive);

我无法弄清楚如何做一个&#39; a&#39;引用导航对象&#39; a.B&#39;作为一个单独的步骤,但这应该得到我所需要的。 是时候测试了。

是。这似乎有效。