【问题标题】:Orderby in IQueryable Lambda ExpressionsIQueryable Lambda 表达式中的 Orderby
【发布时间】:2012-04-05 02:23:40
【问题描述】:

我在使用 EF lambda 表达式时遇到问题。

partial void StatusCallBackRequired_PreprocessQuery(ref IQueryable<PatientsTelephoneFollowupDetail> query)
{
    var newList = PatientsTelephoneFollowupDetails.OrderBy(x => x.Id).ToList();
    query = query.Where(p => p.PatientsMasterItem.PatientsTelephoneFollowupDetail.OrderByDescending(c => c.Id).FirstOrDefault(c => c.Status == "7") != null);
 }

错误是:

“Microsoft.LightSwitch.IOrderedDataServiceQueryable”不包含“ToList”的定义,并且找不到接受“Microsoft.LightSwitch.IOrderedDataServiceQueryable”类型的第一个参数的扩展方法“ToList”(您是否缺少 using 指令或程序集参考?)

我已经包含了 system.linq 命名空间。

编辑:(基于 D Stanley 代码的结果)

可以在下面找到示例数据,我希望检索突出显示的记录

但是当前的输出是

将查询更改为 query.select 仅返回一条记录,但它是错误的记录。

【问题讨论】:

  • 您是否重建它以确保您没有看到过时的编译器错误?
  • 你确定 System.Linq 有 IOrderedDataServiceQueryable 的扩展方法吗?当我用谷歌搜索 IOrderedDataServiceQueryable 时,出现的 only 链接就是这个 SO 问题。我什至无法研究该类型以查看 Linq 是否为它提供了扩展方法。
  • 只是出于兴趣,你为什么要删除 newList 然后不使用它?
  • 什么是Microsoft.LightSwitch.IOrderedDataServiceQueryable?它是否扩展IEnumerable?或者,它有没有扩展方法ToList?如果是这样,您必须 using 包含 extends 方法的命名空间。
  • 我认为preprocessquery函数只支持Iqueryable。是否有替代方法可以使用 IQueryable 而不是 IEnumerable 来实现相同的功能?

标签: c# linq entity-framework linq-to-sql visual-studio-lightswitch


【解决方案1】:

你需要找到这个类型的定义:Microsoft.LightSwitch.IOrderedDataServiceQueryable

找到后,确认:

它是否实现IEnumerable&lt;T&gt;?如果是这样,您的代码无法到达System.Linq.Enumerable。您说您使用的是 System.Linq,因此请确保您的项目引用了 System.Core.dll

如果没有,它是否实现了IEnumerable?如果是这样,您可以编写一个foreach 循环并将每个项目添加到您创建的List&lt;T&gt;

如果不是,请检查属性。通常有一些方法可以得到你可以编写循环的东西。

【讨论】:

  • 我正在使用 LightSwitch,请参阅msdn 上的这篇文章了解更多信息。
【解决方案2】:

要尝试的几件事:

投到IEnumerable&lt;T&gt;:

var newList = ((IEnumerable<PatientsTelephoneFollowupDetail>)PatientsTelephoneFollowupDetails.OrderBy(x => x.Id)).ToList();

根据查询结果初始化列表:

var newList = new List<PatientsTelephoneFollowupDetail>(PatientsTelephoneFollowupDetails.OrderBy(x => x.Id)));

编辑 看起来 LightSwitch 没有实现IEnumerable&lt;T&gt;。还有两件事要尝试:

假设它实现IEnumerable,使用IEnumerable.Cast&lt;T&gt;()

var newList = new List<PatientsTelephoneFollowupDetail>(
    PatientsTelephoneFollowupDetails.OrderBy(x => x.Id)
        .Cast<PatientsTelephoneFollowupDetail>()
    );

蛮力:

var newList = new List<PatientsTelephoneFollowupDetail>();
foreach(var item in PatientsTelephoneFollowupDetails.OrderBy(x => x.Id))
    newList.Add(item);

【讨论】:

  • 尝试第一个没有编译错误,但应用程序在执行此查询时崩溃,并出现以下错误Unable to cast object of type 'Microsoft.LightSwitch.ServerGenerated.Implementation.QueryImplementation1[LightSwitchApplication.PatientsTelephoneFollowupDetail]' 键入'System.Collections.Generic.IEnumerable1[LightSwitchApplication.PatientsTelephoneFollowupDetail]'.
  • 第二个给我以下错误Error 1 The best overloaded method match for 'System.Collections.Generic.List&lt;LightSwitchApplication.PatientsTelephoneFollowupDetail&gt;.List(System.Collections.Generic.IEnumerable&lt;LightSwitchApplication.PatientsTelephoneFollowupDetail&gt;)' has some invalid arguments Error 2 Argument 1: cannot convert from 'Microsoft.LightSwitch.IOrderedDataServiceQueryable&lt;LightSwitchApplication.PatientsTelephoneFollowupDetail&gt;' to 'System.Collections.Generic.IEnumerable&lt;LightSwitchApplication.PatientsTelephoneFollowupDetail&gt;'
  • 我认为preprocessquery函数只支持Iqueryable。我还是不明白 EF、ADO.NET、LINQtoSQL 等的区别
  • IQueryable 派生自 IEnumerable,但显然 LightSwitch 并没有实现 IEnumerable。我已经编辑了我的答案,为您提供了另外几个选项。
  • IEnumerable.Cast() 似乎有效。然而,结果并不如我所料。可能是因为没有使用列表变量吗?如何将有序的新列表应用到查询中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 2021-09-17
  • 2014-01-28
  • 1970-01-01
相关资源
最近更新 更多