所以我有这个多语言数据模型: 产品 -> 产品翻译
Product
拥有Id
属性。ProductTranslation
有一个Culture
(例如"nl")和一个Name
属性。
我已经有一个工作查询,可以将特定语言的产品展平为产品模型(使用自动映射器)。
ProductModel
拥有Id
和Name
住宿。
ProductModel.Name
包含来自相应ProductTranslation
的Name
,我在查询中通过将客户端应用程序区域性与ProductTranslation.Culture
进行比较来确定。
到目前为止一切都很好,没有涉及 LINQKit。
现在我想对ProductTranslation.Name
退回的产品进行排序。我的问题是这是否可以使用 LINQKit。我确实想在数据库端进行排序,因此无法在客户端实现和进行排序(省略分页以简化此处的示例)。
我已经有一个表达式可以确定正确的翻译:
Expression<Func<ICollection<ProductTranslation>, ProductTranslation>> expression =
translations => translations.FirstOrDefault(t => t.Culture.Equals(cultureName))
?? translations.FirstOrDefault();
我是否可以以某种方式扩展它以从返回的ProductTranslation
中获取Name
属性并将其应用为排序表达式?
提前感谢,干杯!
经过更多的调查,这似乎工作正常:
var cultureName = Thread.CurrentThread.CurrentCulture.Name;
var languageName = Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName;
return s => s.FirstOrDefault(t => t.Culture == cultureName).Name ??
s.FirstOrDefault(t => t.Culture == languageName).Name ??
s.FirstOrDefault().Name;
不幸的是,这只能解决我的一部分问题。剩下的问题是,我希望能够使用另一个类型Expression<Func<ProductTranslation>, object>
的 lambda 表达式指定属性(在本例中为Name
),我可以将其传递给创建表达式的方法。
因此,在该方法中,我最终会得到两个需要组合的表达式。它归结为:
public static Expression<Func<Product, object>> FromTranslation
{
get
{
var cultureName = Thread.CurrentThread.CurrentCulture.Name;
var languageName = Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName;
Expression<Func<Product, ProductTranslation>> translationExpression = s =>
s.Translations.FirstOrDefault(t => t.Culture == cultureName) ??
s.Translations.FirstOrDefault(t => t.Culture == languageName) ??
s.Translations.FirstOrDefault();
Expression<Func<ProductTranslation, object>> memberExpression = t => t.Name;
// TODO: Combine expressions somehow?
return ??;
}
}
我可以以某种方式用memberExpression
扩展translationExpression
,所以我最终得到一个表达式吗?