编译查询中可以使用 switch 语句吗?

发布于 2024-09-04 02:39:15 字数 276 浏览 3 评论 0原文

是否可以在 linq toEntity/sql 的编译查询中使用类似 switch 语句之类的东西? 例如,当从数据库返回排序记录时,我想在一个编译查询中使用类似 switch 的语句来对不同属性进行排序,而不必为您可能想要的每个属性编写 2 个编译查询(升序和降序)排序,即使是简单的可排序网格,也最多可以有 10 个已编译的查询。

在 T-SQL 中,使用 case 语句很容易做到这一点,因为我想象大多数数据库都支持这样的构造,那么为什么 linq/entity 框架不支持它呢。

有什么解决办法吗?

Is it at all possible to use something like a switch statement in a compiled query for linq to entities/sql?
For example when returning sorted records from the database, I would like to use a switch-like statement within one compiled query to sort on different properties, instead of having to write 2 compiled queries (ascending & descending) for every property you might want to sort on, which can be up to 10 compiled queries for even a simple sortable grid.

In T-SQL this would be easy with a case statement, as I would imagine a construct like this is supported in most databases, so why would it not be supported in linq/entity framework.

Any solution for this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

榆西 2024-09-11 02:39:15

正如 kyndigs 在他的评论中提到的那样,唯一的解决方案是使用 ? 伪造 switch 语句? : 三级运算符:

        internal static readonly Func<MyEntities, long, MessageSortField, int, int, IQueryable<Model.Message>> MessagesPagedSortedAscQuery =
        CompiledQuery.Compile((MyEntities db, long folderId, MessageSortField sortField, int skip, int take) =>
        (
            sortField == MessageSortField.Date ? db.Messages.Where(e => e.FolderId == folderId).OrderBy(m => m.Date).Skip(skip).Take(take) :
            sortField == MessageSortField.Subject ? db.Messages.Where(e => e.FolderId == folderId).OrderBy(m => m.Subject).Skip(skip).Take(take) :
            sortField == MessageSortField.From ? db.Messages.Where(e => e.FolderId == folderId).OrderBy(m => m.From).Skip(skip).Take(take) :
            db.Messages.Where(e => e.FolderId == folderId).Skip(skip).Take(take)
        ));

As kyndigs refers to in his comment, the only solution is to fake a switch statement with the ? : tertiary operator:

        internal static readonly Func<MyEntities, long, MessageSortField, int, int, IQueryable<Model.Message>> MessagesPagedSortedAscQuery =
        CompiledQuery.Compile((MyEntities db, long folderId, MessageSortField sortField, int skip, int take) =>
        (
            sortField == MessageSortField.Date ? db.Messages.Where(e => e.FolderId == folderId).OrderBy(m => m.Date).Skip(skip).Take(take) :
            sortField == MessageSortField.Subject ? db.Messages.Where(e => e.FolderId == folderId).OrderBy(m => m.Subject).Skip(skip).Take(take) :
            sortField == MessageSortField.From ? db.Messages.Where(e => e.FolderId == folderId).OrderBy(m => m.From).Skip(skip).Take(take) :
            db.Messages.Where(e => e.FolderId == folderId).Skip(skip).Take(take)
        ));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文