Как выбрать данные из datatable, которые не в IEnumerable - PullRequest
1 голос
/ 21 декабря 2011

У меня есть DataTable dbcrs, и я хочу получить только те данные, которые не в следующем перечисляемом:

IEnumerable<Crs> res

Примечание: ключ в обоих id.

Ответы [ 4 ]

2 голосов
/ 21 декабря 2011

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

var result = dbcrs.Where(item => res.FirstOrDefault(resItem => resItem.Id == item.Id) == null);
1 голос
/ 21 декабря 2011

Пример выполнения этого с Except и 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));
        }
1 голос
/ 21 декабря 2011

Сначала вам нужно использовать AsEnumerable(), чтобы выполнить запрос к коллекции строк DataTable, затем используйте !Contains, как показано ниже:

var query = from r in dbcrs.AsEnumerable()
        where !( from s in res select r.Id)
               .Contains(r.Id)
        select r;
0 голосов
/ 04 января 2012
        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, тест

...