";子查询返回了多个值.这是不允许的";需要返回一组值

本文关键字:返回 quot 一组 查询 不允许 | 更新日期: 2023-09-27 18:01:05

var range = this.dataStore.Query<NotificationConfiguration>()
                .Range(p => new NotificationConfigurationViewModel(p, from x in p.Events where !(x.Code == null || x.Code.Equals("")) select x.Code), pageNumber);
return this.View(range);

我有上面的代码,我想在其中返回一个IEnumerable,但得到"子查询返回的值超过1。当每次运行代码时,子查询都跟在=、!=、<、<=、>、>=之后,或者子查询用作表达式时,都不允许这样做。"。我知道查询只想返回一个值,但如何让它按预期返回一组值呢?救命!

让我澄清一下。。。我希望范围包含一个新对象。我有一个正在数据库中查询的问题。它返回数据,然后我使用以下视图模型构造函数进行转换:

public NotificationConfigurationViewModel(NotificationConfiguration notification , IEnumerable<string> codes)
{
    Contract.Requires(notification != null);
    this.notification = notification;
    this.codes = codes;
}

每个通知配置都有属性,然后有一个与之相关的事件列表。我只需要上述列表中的代码。


只是为了再次澄清。我希望查询能给我一个NotificationConfiguration和一个IEnumerable(稍后我将使用SB将其转换为单个字符串(。一旦查询返回这两项,我将在视图模型中使用构造函数对其进行转换,这样我就可以使用DataTable正确地显示所有数据。我正在寻找的答案可能非常具体,但我需要了解为什么当我希望它返回IEnumerable时会出现子查询错误,以及如何修复它。还请注意。。。根据.net文档的说法,代码应该会给我一个IEnumerable,但由于某种原因,它仍然崩溃。以下是相关的代码示例:

        [HttpPost]
    public ActionResult Index(DataTableRequest requestedData)
    {
        using (this.dataStore.Session.BeginTransaction())
        {
            return this.dataStore.Query<NotificationConfiguration>()
                          .TableRange(requestedData, p => new NotificationConfigurationViewModel(p, from x in p.Events select x.Code));
        }
    }

        public NotificationConfigurationViewModel(NotificationConfiguration notification , IEnumerable<string> events)
    {
        Contract.Requires(notification != null);
        this.notification = notification;
        this.events = events;
    }

    [Display(Name = "Events")]
    public virtual string EventTypeCodes
    {
        get
        {
            var codes = new StringBuilder();
            foreach (var item in this.events)
            {
               codes.Append(item + ",");
            }
            return codes.ToString().TrimEnd(',');
        }
    }

";子查询返回了多个值.这是不允许的";需要返回一组值

这里的问题是Range方法(复制如下(。

.Range(p => new NotificationConfigurationViewModel(p, from x in p.Events where !(x.Code == null || x.Code.Equals("")) select x.Code), pageNumber);

Range期望调用方传入以下参数:

public static IEnumerable<int> Range(
    int start,
    int count
)

代码正在(NotificationConfigurationViewModel, int)中传递。这似乎是问题的一部分。我认为适当的解决方案如下:

var range = from p in this.dataStore.Query<NotificationConfiguration>()
select new NotificationConfigurationViewModel(p, p.Events.Where(x => !string.IsNullOrEmpty(x.Code)));

这将从NotificationConfiguration转换为NotificationConfigurationViewModel,同时不包括任何空字符串代码。

答案在查询中,而不是数据集,所以要给出确切的答案,我们需要查看查询。但是,一般来说,您可以使用一些构造。您可能有类似WHERE Id=(SELECT Id FROM Values WHERE DateOFValues BETWEEN FirstDate AND LastDate(的内容。您想要的是WHERE ID IN(SELEct…或WHERE is=ANY(SELEct…或子查询,在这种情况下请查看此处。。。http://allenbrowne.com/subquery-01.html(是的,我知道它说的是访问,但MS SQL支持这里使用的所有sytax。

进行假设。。。这就是你想要的吗?

如果您正试图创建一组新对象,则最好在查询的选择部分内创建对象。

int pageNumber = 0;
int pageSize = 10;
IQueryable<NotificationConfiguration> configurations = this.dataStore.Query<NotificationConfiguration>();
IList<NotificationConfigurationViewModel> viewModels =
    (from configuration in configurations
     where !string.IsNullOrEmpty(configuration.Code)
     select new NotificationConfigurationViewModel(configuration))
    .Skip(pageNumber * pageSize).Take(pageSize).ToList();
return viewModels;
相关文章: