У меня есть DataTable dbcrs
, и я хочу, чтобы получить только данные, которые не в следующем перечислимы:Как выбрать данные из DataTable, которые не в IEnumerable
IEnumerable<Crs> res
Примечание: в ключ в обоих id
.
У меня есть DataTable dbcrs
, и я хочу, чтобы получить только данные, которые не в следующем перечислимы:Как выбрать данные из DataTable, которые не в IEnumerable
IEnumerable<Crs> res
Примечание: в ключ в обоих id
.
Вот мое предложение:
var result = dbcrs.Where(item => res.FirstOrDefault(resItem => resItem.Id == item.Id) == null);
Прежде всего, необходимо использовать AsEnumerable()
для того, чтобы запросить против коллекции Rows в DataTable, а затем использовать !Contains
как не в так:
var query = from r in dbcrs.AsEnumerable()
where !(from s in res select r.Id)
.Contains(r.Id)
select r;
Пример делать это с исключением и 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));
}
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, Тест
'dbcrs.Where (пункт => res.FirstOrDefault (resItem => resItem.Id.TrimEnd() == элемент. [0] .ToString(). TrimEnd()) == null); ' –
Пожалуйста, обновите ответ на этот вопрос. –