Entity framework 4 linq到实体:嵌套的.Any()
在存储库中,我需要搜索联系人(c)的功能,以查找searchCriteria(sc)中定义的其他功能的集合。表达式Func如下所示:Entity framework 4 linq到实体:嵌套的.Any(),entity-framework-4,linq-to-entities,Entity Framework 4,Linq To Entities,在存储库中,我需要搜索联系人(c)的功能,以查找searchCriteria(sc)中定义的其他功能的集合。表达式Func如下所示: // no Problem from here ---> c => c.firstName.StartsWith(sc.FirstName) && c.lastName.StartsWith(sc.LastName) && c.addressData.Any(a => a.City.Starts
// 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.
//这里没有问题-->
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.StreetAddress.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.FeaturePattern.Any(
`fp=>fp.Item1.featureID==c2f.feature.featureID))
//thows:System.Reflection.TargetInvocationException
//内部:无法处理类型System.Tuple 2[],因为它没有到值层的已知映射。
嗯,sc.FeaturePattern
似乎是一个元组,这意味着它不是实体模型/EDMX的一部分。所以LINQtoEntities不知道如何将其转换为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))
//从元组中提取标量值
var featureIds=sc.FeaturePattern.Select(fp=>fp.Item1.featureId);
//现在进行查询
// ...
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.StreetAddress.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 featureIds.Contains(
fid=>fid==c2f.feature.featureID)
今天感觉奥运吗?你用EF做这样的事很勇敢