2010-09-24 68 views
0

我正在使用一个非常讨厌但看不到变化的db。Linq:查询从一个拆分列创建的“虚拟”列

我们有一个表,名为 “位置” 与列, “位置”

此列有一个像 “架子5”

这意味着 “情况A,保质5” 的价值观。在理想的世界中,我会有一个Case和Shelf列,分别为值“A”和5。

我想知道的是,如果有一种方法可以在我的实体类中定义一些“虚拟”(可能不是正确的词)列,以便一旦我这样做,我就可以查询表这些列存在(选择,Where子句,Group By等)?

不可否认,我对Linq很新,所以我甚至没有用正确的技术术语来描述我想要做的事情。这使得难以找到答案。所以,如果有人只是想指向我的任何入门文档,甚至可以帮助我开始,我会认为这是一个有效的答案。

为了使其更加复杂,该列仅按上述结构进行构建,具体取决于其他列的值,但我不会去那里。

感谢您花时间阅读本文。过去的经验告诉我SO员工是最棒的!

回答

0

我已经习惯了凌到SQL,而不是LINQ到实体,但这应该工作

partial class Location 
{ 
    public string Case 
    { 
     get 
     { 
      int pos = Position.IndexOf(' '); 
      if (pos == -1) 
       throw new Exception(); 
      return Position.Substring(pos); 
     } 
    } 

} 
+0

这对于选择非常适用:但是,当我尝试在构造的Where子句中使用它(承认,使用方法来生成动态where子句,请在此处描述:http://stackoverflow.com/questions/3782305/linq- dynamic-query-contruction-query-moves-to-client-side) – donundeen 2010-09-24 21:13:16

+0

错误:成员'Case'不支持转换为SQL。 – donundeen 2010-09-24 21:13:44

+0

[对多个帖子抱歉,我一直打“返回”]。我是否也需要创建set方法,或者其他什么? – donundeen 2010-09-24 21:14:22

0

任何你做给列分成实体框架内的多个其他列不将在您的查询中转换为SQL。这意味着在派生列上进行的任何过滤都将在之后的客户端上检索未被其他where子句元素过滤的所有行。这可能不是什么大问题,但这是你需要牢记的事情。

做一个计算列本身是在部分代码文件中创建一个新属性的简单方法(如James Curran的回答所示)。即使在查询中,您的对象也应该使用该属性。

尽管如此,在您的情况下,我会考虑在数据库级创建视图。可以设置位置表的视图,以将违规列分成两个其他列而没有太多困难,并且额外的开销可以长期收益。你必须观看你的更新,但对于大多数目的来说,这将符合你的目的。

+0

谢谢,可悲的是,我没有那种数据库访问。而且我以前用原始SQL实现了这一点,所以我有点惊讶,我无法在这里描述这个映射。 – donundeen 2010-09-24 21:15:53

+0

这个问题是否以任何方式与模型定义函数相关,如下所述:http://blogs.msdn.com/b/efdesign/archive/2009/01/07/model-defined-functions.aspx?因为我想要的只是在转换为SQL时,列名称是“SUBSTRING(Position,1,1)AS SHELF”而不是“SHELF”。我希望能够在Column属性上定义它(例如:[Column(Function =“SUBSTRING(CurUnitPosition,1,1)”)])。这似乎并不复杂,这就是为什么我不明白为什么我不能这样做。这在C#4.0中可用吗?谢谢! – donundeen 2010-09-28 20:14:03