首页 > 解决方案 > 从 datacontext 返回相同类型的两个视图

问题描述

我创建了两个视图,它们从相同的表中返回完全相同的列。两个视图之间的唯一区别是它们过滤不同的参数。我已将这些添加到我的 .dbml 文件中(dbml中的视图图片),然后为这两个视图自动生成了两个类。

在我的代码中,根据属性过滤器的值,查询两个视图之一,无论是当前的还是以前的。我需要将这些视图作为相同类型返回。所以 IOrderedQueryable<> items 有一个返回类型。

目前,它们以 clientOrdersQueryCurrent 或 clientOrdersQueryPrevious 的形式返回。如果我将 IOrderedQueryable<> 项设置为其中之一并尝试转换另一种类型,则会导致运行时错误。

        IOrderedQueryable<> items;
        bool filterQuery = false;
        if (!string.IsNullOrEmpty(OrderNumber) || DateFrom != null || Dateto != null || !string.IsNullOrEmpty(TrackingNumber) || UserId != null)
        {
            filterQuery = true;
        }

        if (Filter == "Current")
        {
            if (filterQuery)
            {
                items = dataContext.clientOrdersQueryCurrents.Where(o => o.client_id == currentClientIdProvider.GetCurrentClientId()
                            && (string.IsNullOrEmpty(OrderNumber) || o.OrderNumber.Contains(OrderNumber))
                            && (DateFrom == null || o.OrderPlaced >= DateFrom)
                            && (Dateto == null || o.OrderPlaced <= Dateto)
                            && (string.IsNullOrEmpty(TrackingNumber) || o.TrackingReference.Contains(TrackingNumber))
                            && (UserId == null || o.UserId == UserId)).OrderByDescending(o => o.OrderPlaced);
            }
            else
            {
                items = dataContext.clientOrdersQueryCurrents.Where(o => o.client_id == currentClientIdProvider.GetCurrentClientId()).OrderByDescending(o => o.OrderPlaced);
            }
        }
        else if (Filter == "Previous")
        {
            if (filterQuery)
            {
                items = dataContext.clientOrdersQueryPrevious.Where(o => o.client_id == currentClientIdProvider.GetCurrentClientId()
                            && (string.IsNullOrEmpty(OrderNumber) || o.OrderNumber.Contains(OrderNumber))
                            && (DateFrom == null || o.OrderPlaced >= DateFrom)
                            && (Dateto == null || o.OrderPlaced <= Dateto)
                            && (string.IsNullOrEmpty(TrackingNumber) || o.TrackingReference.Contains(TrackingNumber))
                            && (UserId == null || o.UserId == UserId)).OrderByDescending(o => o.OrderPlaced);
            }
            else
            {
                items = dataContext.clientOrdersQueryPrevious.Where(o => o.client_id == currentClientIdProvider.GetCurrentClientId()).OrderByDescending(o => o.OrderPlaced);
            }
        }
        else 
        {
            //Default call - current orders
            items = dataContext.clientOrdersQueryCurrents.Where(o => o.client_id == currentClientIdProvider.GetCurrentClientId()).OrderByDescending(o => o.OrderPlaced);
        }

我目前唯一能想到的解决此问题的方法是创建一个类,并在返回后让查询将结果映射到该类。

做这个的最好方式是什么?

我目前使用的 ORM 是 NHibernate。

标签: c#linqnhibernatedbml

解决方案


最好映射到一些常见的类

IOrderedQueryable<CommonItem> items;

items = dataContext.clientOrdersQueryCurrents.Select(e => new CommonItem{...});
...
items = dataContext.clientOrdersQueryPrevious.Select(e => new CommonItem{...});

可以是AutoMapper的ProjectTo方法

items = dataContext.clientOrdersQueryPrevious.ProjectTo<CommonItem>();

推荐阅读