首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用LINQKit对LINQ查询进行排序

应用LINQKit对LINQ查询进行排序
EN

Stack Overflow用户
提问于 2022-02-17 20:54:29
回答 1查看 49关注 0票数 0

所以我有一个多语言的数据模型:产品-> ProductTranslation

  • Product有一个Id property.
  • ProductTranslation,有一个Culture (例如,nl)和一个Name属性。

我已经有了一个工作查询,它将特定语言的产品简化为ProductModel (使用Automapper)。

  • ProductModel有一个Id和一个Name属性.

ProductModel.Name包含来自适当ProductTranslationName,我在查询中通过将客户端应用程序区域性与ProductTranslation.Culture进行比较来确定该ProductTranslation

到目前为止,一切都很好,而且没有涉及到LINQKit。

现在我想对ProductTranslation.Name退回的产品进行排序。我的问题是,这是否可以使用LINQKit。我确实希望在数据库端进行排序,因此在客户端实现和执行排序是没有选择的(这里省略了分页以简化示例)。

我已经有一个表达式可以确定正确的翻译:

代码语言:javascript
复制
Expression<Func<ICollection<ProductTranslation>, ProductTranslation>> expression =
            translations => translations.FirstOrDefault(t => t.Culture.Equals(cultureName))
                 ?? translations.FirstOrDefault();

我是否可以对此进行扩展,从返回的Name属性中获取ProductTranslation属性,并将其作为排序表达式应用?

提前谢谢,干杯!

EN

回答 1

Stack Overflow用户

发布于 2022-02-18 14:01:15

经过更多的调查后,这似乎很好:

代码语言:javascript
复制
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>),该表达式可以传递给创建表达式的方法。

因此,在这种方法中,我最终得到了两个需要组合的表达式。归根结底是这样的:

代码语言:javascript
复制
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,这样我才能得到一个表达式吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71165240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档