【问题标题】:LINQ Outputting The Values Twice in DataGridLINQ 在 DataGrid 中两次输出值
【发布时间】:2011-05-28 19:06:17
【问题描述】:
        var query = from r in data.AsEnumerable()
                    select new Test
                               {
                                   Name = r.Field<string>(0),
                                   DateReported = r.Field<DateTime>(2)
                               };

        var newQuery = from i in query
                       orderby i.Name, i.DateReported
                       select i;

        myData.DataContext = newQuery;

所以问题是,我正在阅读 Excel 工作表并迭代这些值。如果我使用查询将 DataContext 绑定到 DataGrid,那么一切正常。但是当我将它绑定到 newQuery 时,每个 Item 都会被输出两次

【问题讨论】:

  • 我怀疑这可能是 Linq 的问题。可能您的代码中的其他地方有问题。 data 变量的类型是什么?
  • 我怀疑您的这种方式是有原因的,但是如果您在第一个查询中下订单会发生什么?每条记录只输出一行吗?我还想知道如果您在第二个查询中删除 select 会发生什么。

标签: c# linq datagrid


【解决方案1】:

AsEnumerable() 看起来很可疑;它可能会产生副作用,在执行两次时会导致重复。

我承认我没有立即看到会发生什么。从表面上看,您会认为select new Test{...} 会强制立即评估,而随后的查询仅针对结果。但是当有人试图对他们的类型变得聪明时,我看到了奇怪的事情......

data是什么类型?

【讨论】:

    【解决方案2】:

    尝试在您的 Test 类中覆盖 Equal:

        public class Test
        {
          public string Name { get; set; }
          public DateTime DateReported { get; set; }
    
    
          public override bool Equals(object obj)
          {
            Test test = obj as Test;
            if (test == null )
              return false;
    
            return string.Equals(this.Name, test.Name) && this.DateReported == test.DateReported; 
          }
    
          public override int GetHashCode()
          {
            return Name.GetHashCode() ^ DateReported.GetHashCode();
          }
        }
    

    【讨论】:

      【解决方案3】:

      你直接试过了吗?

      var query = from r in data.AsEnumerable()
          orderby r.Field<string>(0), r.Field<DateTime>(2)
                          select new Test
                                     {
                                         Name = r.Field<string>(0),
                                         DateReported = r.Field<DateTime>(2)
                                     };
      

      然后检查结果? 在我看来,您没有放置实际代码,您只是用示例代码进行演示。它可能来自实际代码。

      等待您的回复。 问候。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-01
        • 2014-07-19
        • 1970-01-01
        • 2011-05-25
        • 1970-01-01
        相关资源
        最近更新 更多