所以我有一个多语言的数据模型:产品-> ProductTranslation
Product有一个Id property.ProductTranslation,有一个Culture (例如,nl)和一个Name属性。我已经有了一个工作查询,它将特定语言的产品简化为ProductModel (使用Automapper)。
ProductModel有一个Id和一个Name属性.ProductModel.Name包含来自适当ProductTranslation的Name,我在查询中通过将客户端应用程序区域性与ProductTranslation.Culture进行比较来确定该ProductTranslation。
到目前为止,一切都很好,而且没有涉及到LINQKit。
现在我想对ProductTranslation.Name退回的产品进行排序。我的问题是,这是否可以使用LINQKit。我确实希望在数据库端进行排序,因此在客户端实现和执行排序是没有选择的(这里省略了分页以简化示例)。
我已经有一个表达式可以确定正确的翻译:
Expression<Func<ICollection<ProductTranslation>, ProductTranslation>> expression =
translations => translations.FirstOrDefault(t => t.Culture.Equals(cultureName))
?? translations.FirstOrDefault();我是否可以对此进行扩展,从返回的Name属性中获取ProductTranslation属性,并将其作为排序表达式应用?
提前谢谢,干杯!
发布于 2022-02-18 14:01:15
经过更多的调查后,这似乎很好:
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表达式指定属性(在本例中是Expression<Func<ProductTranslation>, object>),该表达式可以传递给创建表达式的方法。
因此,在这种方法中,我最终得到了两个需要组合的表达式。归根结底是这样的:
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 ??;
}
}我可以以某种方式用translationExpression扩展memberExpression,这样我才能得到一个表达式吗?
https://stackoverflow.com/questions/71165240
复制相似问题