2012-11-09 4 views
1

나는 이것이 "UNION"시나리오에 해당한다고 확신하지만 실제로 문제를 해결하기위한 최선의 방법을 찾고 있습니다 (UNION이 아닐지라도).).LINQ - 두 쿼리를 병합하고 첫 번째 쿼리에서 항목 제외

var query = context.AffiliateConfigurations.Where(x => x.AffiliateId == affiliateId).Select(config => new ViewModels.ConfigurationItem 
       { 
        ConfigurationId = config.AffiliateConfigurationId, 
        ConfigKey = config.ConfigKey, 
        ConfigValue = config.ConfigValue, 
        UpdatedDate = config.UpdatedDate, 
        ConfigurationType = ViewModels.ConfigurationType.Affiliate 
       }); 

내가하고 싶은 것은 그 쿼리에 몇 가지 더 많은 결과를 추가 할 수 있습니다 :

나는 다음과 같다 쿼리가 있습니다. SiteConfiguration이라는 다른 테이블에 동일한 스키마가 있지만 ConfigKey가 원래 쿼리에없는 테이블의 행만 추가하려고합니다. LINQ 연합 (EU) 연산자는 당신이 원하는 무엇

var items = context.AffiliateConfigurations.Where(x => x.AffiliateId == affiliateId).Select(config => new ViewModels.ConfigurationItem 
    { 
     ConfigurationId = config.AffiliateConfigurationId, 
     ConfigKey = config.ConfigKey, 
     ConfigValue = config.ConfigValue, 
     UpdatedDate = config.UpdatedDate, 
     ConfigurationType = ViewModels.ConfigurationType.Affiliate 
     }).ToList(); 

var query = context.SiteConfigurations.Select(config => new ViewModels.ConfigurationItem 
{ 
    ConfigurationId = config.SiteConfigurationId, 
    ConfigKey = config.ConfigKey, 
    ConfigValue = config.ConfigValue, 
    UpdatedDate = config.UpdatedDate 
}); 

foreach (var item in query) 
{ 
    if (items.All(x => x.ConfigKey != item.ConfigKey)) 
    { 
     items.Add(item); 
    } 
} 
+0

Except()를 사용해 보셨습니까? http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except.aspx – Hardrada

답변

2

그래서 질문 "I have two collections and i want to merge them.how do i exclude items from the second collection,if the item's property is matching with another item's property on the first list."

예 LINQ의 UNION은 같은 시나리오에서 필요로하는 무슨이다

당신이해야 할 모든이가 간단한 비교 자 클래스합니다 (IEqualityComparer 인터페이스를 구현)를 쓰기입니다

당신의 ConfigurationItem

class ConfigEqualityComparer : IEqualityComparer<ConfigurationItem> 
{ 

    public bool Equals(ConfigurationItem a, ConfigurationItem b) 
    { 
     if (a.ConfigKey == b.ConfigKey) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    public int GetHashCode(ConfigurationItem a) 
    { 
      //do some hashing here 
      //int hCode = IntegerField1^IntegerField2; 
      return hCode.GetHashCode(); 
    } 

} 

모든 당신 즉 need.You 이제 UNION 쿼리를 실행하고 예상 출력을 얻을 수 있습니다.

var comparer = new ConfigEqualityComparer(); 
var result = Enumerable.Union<ConfigurationItem>(items, query, comparer); 
1

내가 생각 :

은 내가 (및 작동) 현재 다음과 같은 것을 가지고,하지만 난 그것을 할 수있는 "순수"LINQ의 방법을 찾고 있어요 . 아이템에 대해 IEqualityComparer<T> 인터페이스를 구현하는 클래스를 만들어야합니다. 다음은 데모 코드입니다. 비교 자없이 foreach을 사용하여 포함 된 중복 사진을 보거나 제거 된 사진을 확인하십시오. LINQPad에서 코드를 실행 중이 었는데 Visual Studio를 사용하는 경우 Main 메서드를 클래스로 이동하여 호출해야합니다.

void Main() 
{ 
    List<DataObject> set1 = new List<DataObject>(); 
    List<DataObject> set2 = new List<DataObject>(); 

    set1.Add(new DataObject("a")); 
    set1.Add(new DataObject("b")); 
    set1.Add(new DataObject("c")); 
    set1.Add(new DataObject("d")); 
    set1.Add(new DataObject("e")); 

    set2.Add(new DataObject("c")); 
    set2.Add(new DataObject("d")); 
    set2.Add(new DataObject("e")); 
    set2.Add(new DataObject("f")); 
    set2.Add(new DataObject("g")); 
    set2.Add(new DataObject("h")); 

    // try as 
    // foreach (DataObject d in set1.Union(set2)) { 
    // and dupes will be present 

    foreach (DataObject d in set1.Union(set2, new DOComparer())) { 
     Console.WriteLine(d); 
    } 
} 

// Define other methods and classes here 
public class DataObject { 
    public DataObject(string value) { 
     Value = value; 
    } 
    public string Value {get;private set;} 

    public override string ToString() { 
     return Value; 
    } 
} 

public class DOComparer:IEqualityComparer<DataObject> { 
    public bool Equals(DataObject do1, DataObject do2) { 
     return do1.Value.Equals(do2.Value); 
    } 

    public int GetHashCode(DataObject d) { 
     return d.Value.GetHashCode(); 
    } 
} 
관련 문제