2014-10-31 4 views
1

У меня есть набор политик, которые содержат коллекцию резюме, которые содержат имя службы и тип продукта, которые могут иметь продукты, разделенные запятыми. Мне нужно найти, соответствует ли какое-либо из общих имен службы policyNames любому из значений, разделенных запятыми, в типе продукта. Например:Linq Query with Foreach

productType.Split(',') 
      .Select(p => p.Equals(policies.summaries.ForEach(s => { s.serviceName = p}))); 

и

var name = from s in productType.Split(',') 
      where s = policies.summaries.ForEach(p=> { p.serviceName == s}) 
      select s; 

Я знаю, что выше обыкновение компиляции, но просто интересно, если это может быть сделано в LINQ

+5

Вы в настоящее время * изменяете * сводки в выражении лямбда в первом фрагменте. Это не то же самое, что * проверка * для них. Помните, что LINQ для * запросов * - и очень ясно о различии между '=' и '=='. –

+0

Спасибо John за подсказку – amun1000

ответ

1

Да, это p жно, попробовать что-то вроде этого:

var productTypes = productType.Split(','); 

//if you need to get matched policies 
var matchedPolicies = policies 
    .Where(x => x.summaries.Any(y => productTypes.Contains(y.serviceName))); 

//if you need to get matched summaries 
var matchedSummaries = policies.SelectMany(x => x.summaries) 
    .Where(x => productTypes.Contains(x.serviceName)); 

И тогда вы можете использовать matchedPolicies.Any() или matchedSummaries.Any(), чтобы определить, есть ли какие-либо из сводки политики serviceNames совпадает с любым из разделенных запятой значений в типе продукта.

В качестве альтернативы, если вы не заботитесь о конкретной соответствуют политике вы можете использовать Any сразу policies.Any(x => x.summaries.Any(y => productTypes.Contains(y.serviceName)))

предполагает также 101 LINQ SAMPLES для дополнительного чтения с некоторыми большими примерами.

+0

Cheers Vladimirs – amun1000

1
productType.Split(',').Any(x => policies.SelectMany(p => p.summaries) 
             .Any(s => s.serviceName == x)) 

альтернативно (быстрее, но менее читаемым):

productType.Split(',').Join(policies.SelectMany(p => p.summaries), 
          x => x,    //match split strings 
          p => p.serviceName, //with summary service name 
          (x, p) => p)   //selector - irrelevant with any 
         .Any() 
+0

Вы не можете использовать ** policy.summaries ** должны быть ** policy.SelectMany (x => x.summaries) ** – Vladimirs

+0

Как вы сделали вывод, что из кода OP? На самом деле, напротив, я вижу, что он явно использует 'policy.summaries', поэтому два варианта - либо это странное соглашение об именах (я пошел с этим), либо образцы кода OP полностью не синхронизированы с реальностью, - но Хороший недостаток, дающий осмысленный ответ в этом случае. – decPL

+0

** «У меня есть своя политика ..» ** – Vladimirs

1

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

var query = from p in policies 
         from s in p.Summaries.Where(x => x.ProductType.Split(',').Contains(x.ServiceName)) 
         select s.ServiceName; 

Где я использовал follwoing Тип: -

public class Summary 
    { 
     public string ServiceName {get; set;} 
     public string ProductType {get; set;} 
    } 

    public class Policy 
    { 
     public List<Summary> Summaries { get; set; } 
    } 

Вот полный работает Fiddle.