1

我看到 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 类来实现这个目标?任何帮助表示赞赏。

4

2 回答 2

1

首先,我不会尝试将 XML 扩展转换为 SQL。它们是为不同的野兽设计的,这是有原因的。

使用正确的数据库策略,您应该能够摆脱一组 linq 查询。(您可能需要调整它们以适应新模型。)例如,如果您有一个因语言而异的描述字段,则创建一个将根据所选语言返回正确描述的视图。现在将您的 linq 查询指向视图而不是表。

附加信息:每个项目只有一个视图,其中包含多语言字段。每个多语言字段都有自己的表,使用语言表键和原始对象的键作为复合键。该视图将所有表组合回一个位置以进行查询。现在说我们有一个产品视图。如果我通过 ProductId = 1 查询该视图,我实际上会看到与语言一样多的产品副本。

现在,您的 Linq 查询将始终包含一个受语言限制的参数。只要确保在查询中使用外连接,这样如果缺少某种语言的描述,您仍然可以取回它。(或者不使用它来故意将项目限制为选择语言的设置。

您可以创建存储过程来打开更新视图的功能,使其像表格一样。(或者您可以通过在大多数 ARM 框架中连接存储的过程来做到这一点。)

于 2010-04-02T19:46:17.380 回答
0

好吧,实际的问题是,使用的 Where 不是 System.Linq 命名空间中的那个,而是另一个,并且它不能被 ef 的表达式访问者翻译。

于 2013-02-18T15:09:29.157 回答