【问题标题】:error: The query results cannot be enumerated more than once错误:查询结果不能枚举多次
【发布时间】:2011-07-06 14:27:08
【问题描述】:
Edit:

 DataClassesDataContext dc = new DataClassesDataContext();
 string _idCompany = Request["idCompany"];
        var newes = dc.GetNewsCompany(Int64.Parse(_idCompany));            
        string date = "";
        string newsHtml = "<center>"; 
        if(newes.GetEnumerator().MoveNext()){
            foreach (var item in newes)//say Error .......................
            {
               // date = calendar.GetDayOfMonth(item.DateSend) + "/" + calendar.GetMonth(item.DateSend) + "/" + calendar.GetYear(item.DateSend).ToString();
            //    newsHtml += "<li class='news-item'><a style='text-decoration:none' class=\"link\" onclick=\"$(\'#BodyNews\').text(\'" + HttpUtility.HtmlEncode(item.Body).Trim() + "\');$(\'#BodyNews\').dialog({resizable:false});\"   href=\"#\" > " + item.Title.ToString() + "</a>&nbsp;" + date + "   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;       </li>";

            }

            newsHtml += "</center>";
            }
            else
            {
               // var propertyCompany = dc.GetPropertyCompanyById(Int64.Parse(_idCompany));
           //     newsHtml += "<li class='news-item'><a style='text-decoration:none' class=\"link\" );$(\'#BodyNews\').dialog({resizable:false});\"   href=\"#\" > " + "!به صفحه شخصی شرکت " + propertyCompany.FirstOrDefault().NameCompany + " خوش آمدید " + "</a>&nbsp;" + date + "   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;       </li>";

            }
        return newsHtml;

说错误:查询结果不能枚举多次

不枚举如何检查var为空或null;

【问题讨论】:

  • 重新编辑:是的,Movenext 之后一切都会出错。所以删除 MoveNext。
  • 如果删除 moveNext 然后 newes.all() 再次出现同样的错误
  • 如果您使用 newesList.All() 则不会。请仔细阅读答案,我们现在重复自己。
  • 如何检查newes是否为空或为空
  • no 那么newes 不起作用,因为同样的错误

标签: c# asp.net linq linq-to-entities


【解决方案1】:

为什么要打扰if

var newes = dc.GetNewsCompany(Int64.Parse(_idCompany));
//if (newes.GetEnumerator().MoveNext())//check is null or empty
var newesList = newes.ToList();
if (neweList.Count > 0) 
{
    ...
}

之后您可以随时查看newesList.Count 属性。

【讨论】:

  • 那你喜欢一些糟糕的编码习惯。
  • 多方法无所谓。新闻将是IEnumerable&lt;X&gt;,如果 ToList 为空,它将非常便宜。 MoveNext() 将使您的结果处于几乎总是无法在其他地方使用的状态。
  • var newesList=newes.ToList();newes.All(); say error agin: 查询结果不能枚举多次
  • newes.All() 是从哪里来的?将其设为 newesList.All()。
【解决方案2】:

不确定什么可以作为 newes 中的成员,但如果它是一个对象并且取决于 dc.GetNewsCompany 返回的内容,您可以检查 null

if (news == null) return;

或者如果它返回一个空集合/数组,只需检查计数/长度:

if (news.Count == 0) return;
if (news.Length == 0) return;

【讨论】:

  • no, if(news.count==0)return or ...;say error: cannot be applied to 'method group' 和 'int' 类型的操作数
  • newes 永远不会为空。当有(很多)记录时,newes.Count() 的成本几乎与ToList() 一样昂贵。
【解决方案3】:

错误来了,因为您在 newes 上使用 .GetEnumerator(),然后在 foreach 循环中再次使用 newes .. 这会导致“双重枚举”。

通常避免使用 foreach 遍历“此类 var”,因为 DataReader 被锁定整个循环!。意味着您不能在此循环中使用相同的实体。

最好.ToList(),你可以list.AsQuearable agian如果你想Linq就可以了

f.e.像

var newes = dc.CompanyTable.Where(ln => ln.id.Equals(_idCompany));;
List<CompanyTable> newesList = newes.ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多