Результирующий запрос LinQ для сравнения - PullRequest
0 голосов
/ 28 декабря 2011

В .NET 3.5, ASP.NET с использованием C #

Из приведенного ниже запроса

var query = table.AsEnumerable()
             .Where(p => p.Field<string>("Customer_Code") == "1001")
             .Select(p => new 
                           {
                              Location = p.Field<string>("Location"),
                              Country = p.Field<string>("Country")
                           })
              .Distinct();

Я хочу сравнить результирующий запрос результатов, таких как Местоположение, Страна с каждой строкой данных DataTable Местоположение и Страна

ИЛИ Обратно, я хочу сравнитькаждый результат запроса с каждой строкой таблицы данных

Как я могу выполнить то же самое?

Образец данных:

Location     Country
Bangalore    India
Hyderabad    India
Florida       USA
London        UK
Delhi        India

Ответы [ 3 ]

1 голос
/ 28 декабря 2011

Как насчет того, чтобы проверить соответствие:

foreach(DataRow row in table.Rows)
{
   var result = query.SingleOrDefault(x=> 
            x.Location.ToLower() = row["Location"].ToLower() 
            && x.Country.ToLower() = row["Country"].ToLower()
        );
   if(result != null)
   {
        //Hurray, result is a match!
   }
}

Примечание: * Проверка .Where(...).Count >0 может быть лучше в зависимости от того, что вы найдете в запросе. Если вы ожидаете несколько попаданий, используйте .Where() вместо .SingleOrDefault()

Новая идея Если вы не против обработать ваш DataTable и сохранить его в IEnumerable, вы можете использовать LINQ-объединения для соединения двух списков. Немного сложнее, но я думаю, что это будет эффективнее.

1 голос
/ 28 декабря 2011

Как насчет Пересечь? Смотри http://gehirnwindung.de/post/2010/05/19/LINQ-Extension-Methods-Intersect.aspx

1 голос
/ 28 декабря 2011

Попробуйте это

создать класс

Class Temp
{
    public String Location {get;set;}
    public String Country {get;set;}
}

затем

List<Temp> list = table.AsEnumerable()
             .Where(p => p.Field<string>("Customer_Code") == "1001")
             .Select(p => new Temp()
                           {
                              Location = p.Field<string>("Location"),
                              Country = p.Field<string>("Country")
                           })
             .Distinct().ToList();

затем сравните, как это

foreach (Temp t in list)
{
    foreach(DataRow row in table.Rows)
    {
       //do your comparison
    }
}
...