gpt4 book ai didi

c# - 如何动态执行多个 Linq to Entities 排序

转载 作者:太空狗 更新时间:2023-10-30 00:01:48 25 4
gpt4 key购买 nike

所以我的问题是这样的;在 C# 代码中,我需要在 Linq to Entities 的帮助下根据输入参数对实体集执行多个排序。有三列要排序,排序列的顺序本身是可变的(这意味着对于每个排序,我需要查找要排序的列)。我怎样才能做到这一点?

我有一些应该可以工作的代码,但我重复了太多次,因为我无法参数化我的操作(Linq to Entities 非常严格,我被允许在我的 lambda 中做的事情)。请建议我如何根据 DRY 重写我的代码原理,或许借助于 T4 代码生成?

下面的代码应该可以说明我的问题。这是真实代码的摘录,为简洁起见,让我知道是否应该包括更多内容。 orderSpecs 变量是一个“顺序规范”数组,每个规范指定要排序的列以及是否以降序方式排序。 orderSpecs 数组至少有一个元素,因此至少执行一次排序。

using (var db = new MyContainer())
{
var orderSpec = orderSpecs[0];
IQueryable<DbVersion> dVersions = null;
if (orderSpec.Column == 0)
{
if (orderSpec.Descending)
{
dVersions = db.Versions.OrderByDescending(ver => ver.Name);
}
else
{
dVersions = db.Versions.OrderBy(ver => ver.Name);
}
}
else if (orderSpec.Column == 1)
{
if (orderSpec.Descending)
{
dVersions = db.Versions.OrderByDescending(ver => ver.Built);
}
else
{
dVersions = db.Versions.OrderBy(ver => ver.Built);
}
}
else if (orderSpec.Column == 2)
{
if (orderSpec.Descending)
{
dVersions = db.Versions.OrderByDescending(ver => ver.Id);
}
else
{
dVersions = db.Versions.OrderBy(ver => ver.Id);
}
}

foreach (var spec in orderSpecs.Skip(1))
{
if (spec.Column == 0)
{
if (spec.Descending)
{
dVersions = dVersions.ThenByDescending(ver => ver.Name);
}
else
{
dVersions = dVersions.ThenBy(ver => ver.Name);
}
}
else if (spec.Column == 1)
{
if (spec.Descending)
{
dVersions = dVersions.ThenByDescending(ver => ver.Built);
}
else
{
dVersions = dVersions.ThenBy(ver => ver.Built);
}
}
else if (spec.Column == 2)
{
if (spec.Descending)
{
dVersions = dVersions.ThenByDescending(ver => ver.Id);
}
else
{
dVersions = dVersions.ThenBy(ver => ver.Id);
}
}
}

最佳答案

如何创建一个字典来将这些导致这些巨大的 if-else 构造的列映射到属性。可能看起来像这样:

using (var db = new MyContainer())
{
var orderSpec = orderSpecs[0];
IOrderedEnumerable<DbVersion> dVersions;

var mapping = new Dictionary<int, Func<DbVersion, object>>()
{
{ 0, ver => ver.Name },
{ 1, ver => ver.Built },
{ 2, ver => ver.Id }
};

if (orderSpec.Descending)
dVersions = db.Versions.OrderByDescending(mapping[orderSpec.Column]);
else
dVersions = db.Versions.OrderBy(mapping[orderSpec.Column]);

foreach (var spec in orderSpecs.Skip(1))
{
if (spec.Descending)
dVersions = dVersions.ThenByDescending(mapping[spec.Column]);
else
dVersions = dVersions.ThenBy(mapping[spec.Column]);
}
}

关于c# - 如何动态执行多个 Linq to Entities 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10549788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com