【问题标题】:linq to entities: nested .Any()linq 到实体:嵌套的 .Any()
【发布时间】:2011-02-01 23:28:04
【问题描述】:

在存储库中,我需要搜索联系人 (c) 的特征,以查找在 searchCriteria (sc) 中定义的其他特征的集合。表达式函数如下所示:

// no Problem from here --->  
c => c.firstName.StartsWith(sc.FirstName)  
  && c.lastName.StartsWith(sc.LastName)  
  && c.addressData.Any(a => a.City.StartsWith(sc.City))  
  && c.addressData.Any(a => a.StreetAddr.StartsWith(sc.Street))  
  && c.addressData.Any(a => a.ZIPCode.StartsWith(sc.ZipCode))  
  && c.visit.Any(v=> v.vStartDate >= sc.VisitTimeIntervalStart)  
  && c.visit.Any(v => v.vStartDate <= sc.VisitTimeIntervalEnd)  
  // <-- to here  but this ->  
  && c.contact2feature.Any( 
      c2f => sc.FeaturePattern.Any(       
         ` fp => fp.Item1.featureID == c2f.feature.featureID))     
// thows:  System.Reflection.TargetInvocationException  
// Inner: Unable to process the type System.Tuple 2[], because it has no known mapping to the value layer.   

【问题讨论】:

  • 今天感觉像奥运一样?你很勇敢地和英孚一起做这样的事情。 ;)

标签: entity-framework-4 linq-to-entities


【解决方案1】:

嗯,sc.FeaturePattern 似乎是 Tuple,这意味着它不是您的实体模型/EDMX 的一部分。所以 LINQ to Entities 不知道如何将其转换为 SQL。但是你可以很容易地解决这个问题:

// extract scalar values from tuple
var featureIds = sc.FeaturePattern.Select(fp => fp.Item1.featureId);

// now do query
// ...
c => c.firstName.StartsWith(sc.FirstName)  
  && c.lastName.StartsWith(sc.LastName)  
  && c.addressData.Any(a => a.City.StartsWith(sc.City))  
  && c.addressData.Any(a => a.StreetAddr.StartsWith(sc.Street))  
  && c.addressData.Any(a => a.ZIPCode.StartsWith(sc.ZipCode))  
  && c.visit.Any(v=> v.vStartDate >= sc.VisitTimeIntervalStart)  
  && c.visit.Any(v => v.vStartDate <= sc.VisitTimeIntervalEnd)  
  // <-- to here  but this ->  
  && c.contact2feature.Any( 
      c2f => featureIds.Contains(       
          fid => fid == c2f.feature.featureID))   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多