मैं एक विधि में एक LINQ अभिव्यक्ति refactor करने के लिए कोशिश कर रहे हैं, और दोनों "Internal .NET Framework Data Provider error 1025.
" और "The parameter 'xyz' was not bound in the specified LINQ to Entities query expression.
" अपवाद में चल गया है LINQ का उपयोग कर refactor करने में असमर्थ।संस्थाओं और LinqKit/PredicateBuilder
यहाँ इकाई मॉडल के प्रासंगिक भागों रहे हैं (एफई 4.2 का प्रयोग/LINQ संस्थाओं के लिए):
public class Place : Entity
{
public string OfficialName { get; protected internal set; }
public virtual ICollection<PlaceName> { get; protected internal set; }
}
public class PlaceName : Entity
{
public string Text { get; protected internal set; }
public string AsciiEquivalent { get; protected internal set; }
public virtual Language TranslationTo { get; protected internal set; }
}
public class Language : Entity
{
public string TwoLetterIsoCode { get; protected internal set; }
}
बुनियादी संबंधपरक मॉडल यह है:
Place (1) <-----> (0..*) PlaceName (0..*) <-----> (0..1) Language
मैं एक बनाने के लिए कोशिश कर रहा हूँ क्वेरी जो term
खोजेगी, Place
इकाइयों को खोजने का प्रयास करें जिनके OfficialName
term
से शुरू होते हैं या जिनके पास PlaceName
है जिसका Text
या AsciiEquivalent
है खोज term
से शुरू होता है। (Language
नहीं जहाँ मैं समस्या हो रही है, हालांकि यह क्वेरी का हिस्सा है, क्योंकि PlaceName
ही CultureInfo.CurrentUICulture.TwoLetterIsoLanguageName
मेल चाहिए।)
निम्नलिखित कोड काम करता है:
internal static IQueryable<Place> WithName(this IQueryable<Place> queryable,
string term)
{
var matchesName = OfficialNameMatches(term)
.Or(NonOfficialNameMatches(term));
return queryable.AsExpandable().Where(matchesName);
}
private static Expression<Func<Place, bool>> OfficialNameMatches(string term)
{
return place => place.OfficialName.StartsWith(term);
}
private static Expression<Func<Place, bool>> NonOfficialNameMatches(string term)
{
var currentLanguage = CultureInfo.CurrentUICulture.TwoLetterISOLanguageName;
return place => place.Names.Any(
name =>
name.TranslationToLanguage != null
&&
name.TranslationToLanguage.TwoLetterIsoCode == currentLanguage
&&
(
name.Text.StartsWith(term)
||
(
name.AsciiEquivalent != null
&&
name.AsciiEquivalent.StartsWith(term)
)
)
);
}
मैं जो करने की कोशिश कर रहा हूं वह NonOfficialNameMatches
विधि को name => ...
अभिव्यक्ति को एक अलग विधि में निकालने के लिए रीफैक्टर है, ताकि इसे अन्य प्रश्नों द्वारा पुन: उपयोग किया जा सके। यहाँ एक उदाहरण है मैं कोशिश की है, जो काम नहीं करता है और अपवाद "The parameter 'place' was not bound in the specified LINQ to Entities query expression.
" फेंकता है:
private static Expression<Func<Place, bool>> NonOfficialNameMatches(string term)
{
return place => place.Names.AsQueryable().AsExpandable()
.Any(PlaceNameMatches(term));
}
public static Expression<Func<PlaceName, bool>> PlaceNameMatches(string term)
{
var currentLanguage = CultureInfo.CurrentUICulture.TwoLetterISOLanguageName;
return name =>
name.TranslationToLanguage != null
&&
name.TranslationToLanguage.TwoLetterIsoCode == currentLanguage
&&
(
name.Text.StartsWith(term)
||
(
name.AsciiEquivalent != null
&&
name.AsciiEquivalent.StartsWith(term)
)
);
}
मैं NonOfficialNameMatches
में .AsExpandable()
श्रृंखला की जरूरत नहीं है, तो मैं "Internal .NET Framework Data Provider error 1025.
" अपवाद मिलता है।
मैंने other advice here का पालन किया है जैसे भविष्यवाणी पर .Expand()
का आह्वान करने के कई संयोजन, लेकिन हमेशा उपर्युक्त अपवादों में से एक के साथ समाप्त होते हैं।
क्या यह अभिव्यक्ति LINQKit/PredicateBuilder के साथ LINQ से इकाइयों का उपयोग करके एक अलग विधि में कारक करना संभव है? यदि हां, तो कैसे? मैं क्या गलत कर रहा हूं?
+100 भाव, धन्यवाद मैं इस सवाल का जवाब पाने के लिए कभी नहीं होगा सोचना शुरू किया गया था। अतिरिक्त स्पष्टीकरण भी मदद करता है। – danludwig