好的,我正在使用OLD SQL数据库,这个数据库已经足够大了,原本你无法索引位字段。 所以我有一堆表,其中包含Y / N单个字段。
我终于有机会将事情转移到C#和实体框架中。
能够将它们“转换”为前端的布尔字段真的很方便。 但是当我这样做时,我在查询时将Linq分解为实体。
e.g。
db.Carriers.Where(x => x.ActiveBool)去世。
db.Carriers.ToList()。其中(x => x.ActiveBool)没有。 但显然,没有回溯到SQL等等。
是否可以使用其中一种(或其他聪明/方便的)
答案 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;作为一个单独的步骤,但这应该得到我所需要的。 是时候测试了。
是。这似乎有效。