我看到 DamienG 的文章 ( http://damieng.com/blog/2009/06/24/client-side-properties-and-any-remote-linq-provider ) 如何将客户端属性映射到 sql。我浏览了这篇文章,我看到了它的巨大潜力。绝对将客户端属性映射到 SQL 是一个很棒的主意。
但我想用它来做一些更复杂的事情,然后只是连接字符串。Atm 我们正在尝试向我们的业务对象引入多语言,我希望我们可以保持所有现有的 linq2sql 查询不变,只需更改多语言属性的代码,这样它们实际上会返回 CurrentUICulture 中的给定属性。
第一个想法是将这些字段更改为 XML,然后尝试 Object.Property.Elements().Where(...),但它卡在 Elements() 上,因为它无法将其转换为 sql。我在某处读到 XML 字段实际上被视为字符串,并且仅在应用服务器上它们才成为 XElement,因此无论如何过滤都将在应用服务器上,而不是在数据库上。公平点,它不会像这样工作。让我们试试别的...所以第二个想法是创建一个 PolyGlots 表(名称取自http://weblogic.sys-con.com/node/102698?page=0,1)、一个 PolyGlotTranslations 表和一个 Culture表,其中将从每个国际化属性中引用 PolyGlots。这种方式我想说例如:
private static readonly CompiledExpression<Announcement, string> nameExpression
= DefaultTranslationOf<Announcement>
.Property(e => e.Name)
.Is(e=> e.NamePolyGlot.PolyGlotTranslations
.Where(t=> t.Culture.Code == Thread.CurrentThread.CurrentUICulture.Name)
.Single().Value
);
现在不幸的是,在这里我收到一个错误,即无法将 Where() 函数转换为 sql,这有点令人失望,因为我确信它会通过。我猜它失败了,因为 IEntitySet 基本上是一个 IEnumerable,而不是 IQueryable,对吗?
有没有另一种方法可以使用compiledExpressions 类来实现这个目标?任何帮助表示赞赏。