2011-12-21 2 views

ответ

2

Вот мое предложение:

var result = dbcrs.Where(item => res.FirstOrDefault(resItem => resItem.Id == item.Id) == null); 
+0

'dbcrs.Where (пункт => res.FirstOrDefault (resItem => resItem.Id.TrimEnd() == элемент. [0] .ToString(). TrimEnd()) == null); ' –

+0

Пожалуйста, обновите ответ на этот вопрос. –

1

Прежде всего, необходимо использовать AsEnumerable() для того, чтобы запросить против коллекции Rows в DataTable, а затем использовать !Contains как не в так:

var query = from r in dbcrs.AsEnumerable() 
     where !(from s in res select r.Id) 
       .Contains(r.Id) 
     select r; 
1

Пример делать это с исключением и IEquatable <>

Преимущество этого способа состоит в том, что вы можете определить, что вы имеете в виду под «равными», так что все еще могут использоваться два списка, которые могут иметь одинаковые идентификаторы, но НЕ равны.

например. Вы получаете данные из двух таблиц, поэтому идентификаторы могут повторяться, но некоторые другие свойства определяют, действительно ли они равны.

class Crs:IEquatable<Crs> 
     { 
      public int Id { get; set; } 
      public string Description { get; set; } 

      public bool Equals(Crs other) 
      { 
       if (Object.ReferenceEquals(other, null)) 
        return false; 

       if (Object.ReferenceEquals(this, other)) 
        return true; 

       return Id.Equals(other.Id) && Description.Equals(other.Description); 
      } 

      public override int GetHashCode() 
      { 
       int hashId = Id.GetHashCode(); 
       int hashDescription = Description == null ? 0 : Description.GetHashCode(); 
       return hashId^hashDescription; 
      } 

     } 

     internal static void RunMe() 
     { 
      var dataTable = new List<Crs>(){ 
       new Crs{Id=1, Description="First"}, 
       new Crs{Id=2, Description="Second"}, 
       new Crs{Id=5, Description="Fifth"} 
      }; 

      var enumerable = new List<Crs>(){ 
       new Crs{Id=2, Description="Second"}, 
       new Crs{Id=4, Description="Fourth"} 
      }; 

      var distinct = dataTable.Except(enumerable); 

      distinct.ToList().ForEach(d => Console.WriteLine("{0}: {1}", d.Id, d.Description)); 
     } 
0
 DataTable dt = new DataTable(); 
     dt.Columns.AddRange(new DataColumn[] 
     { 
      new DataColumn("Id", typeof(System.Int32)), 
      new DataColumn("Name", typeof(System.String)) 

     }); 

     dt.Rows.Add (new Object[]{1,"Test"}); 
     dt.Rows.Add(new Object[] {2, "Test" }); 



     var l = new Int32[] { 2, 4 }; 


     var l1 = dt.AsEnumerable().Where(p1 => Array.IndexOf(l, p1.Field<Int32>(0))<0).CopyToDataTable(); 

Это возвращает нас на одну строку, так как в DataTable и массив оба имеют одно значение общего, что это 2 только. так из пут будет

2, Тест

Смежные вопросы