使用 LINQKit 将排序应用于 LINQ 查询



所以我有这个多语言数据模型: 产品 -> 产品翻译

  • Product拥有Id属性。
  • ProductTranslation有一个Culture(例如"nl")和一个Name属性。

我已经有一个工作查询,可以将特定语言的产品展平为产品模型(使用自动映射器)。

  • ProductModel拥有IdName住宿。

ProductModel.Name包含来自相应ProductTranslationName,我在查询中通过将客户端应用程序区域性与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,所以我最终得到一个表达式吗?

最新更新