इकाइयों में linq में हमें एक विधि की आवश्यकता है जो "sql like" जैसा काम करता है। हम IQueryable के लिए अपने स्वयं के विस्तार विधि को लागू किया है, क्योंकि शामिल विधि हमारे लिए काम नहीं है, क्योंकि जैसे पैटर्न को स्वीकार नहीं करता '% एक% ख%'एक्सटेंशन विधि जहां लिनक में इकाइयों को
बनाई कोड है:
private const char WildcardCharacter = '%';
public static IQueryable<TSource> WhereLike<TSource>(this IQueryable<TSource> _source, Expression<Func<TSource, string>> _valueSelector, string _textSearch)
{
if (_valueSelector == null)
{
throw new ArgumentNullException("valueSelector");
}
return _source.Where(BuildLikeExpressionWithWildcards(_valueSelector, _textSearch));
}
private static Expression<Func<TSource, bool>> BuildLikeExpressionWithWildcards<TSource>(Expression<Func<TSource, string>> _valueSelector, string _textToSearch)
{
var method = GetPatIndexMethod();
var body = Expression.Call(method, Expression.Constant(WildcardCharacter + _textToSearch + WildcardCharacter), _valueSelector.Body);
var parameter = _valueSelector.Parameters.Single();
UnaryExpression expressionConvert = Expression.Convert(Expression.Constant(0), typeof(int?));
return Expression.Lambda<Func<TSource, bool>> (Expression.GreaterThan(body, expressionConvert), parameter);
}
private static MethodInfo GetPatIndexMethod()
{
var methodName = "PatIndex";
Type stringType = typeof(SqlFunctions);
return stringType.GetMethod(methodName);
}
यह ठीक से काम करता और कोड SqlServer में पूरी तरह से क्रियान्वित किया जाता है, लेकिन अब हम जहां खंड के रूप में अंदर इस विस्तार विधि का प्रयोग करेंगे:
myDBContext.MyObject.Where(o => o.Description.Like(patternToSearch) || o.Title.Like(patterToSerch));
समस्या यह है कि तरीकों जहां खंड में प्रयोग किया जाता है एक bool परिणाम वापस जाने के लिए अगर है इसका इस्तेमाल किया ऑपरेटरों के साथ '||' , और मुझे नहीं पता कि मेरे द्वारा बनाए गए कोड को एक बूल देता है और कोड को SQL सर्वर में निष्पादित किया जाता है। मुझे लगता है कि मुझे बॉल करने के लिए BuildLinqExpression विधि द्वारा लौटा हुआ अभिव्यक्ति परिवर्तित करना है, लेकिन मुझे नहीं पता कि यह कैसे करें
समेट करने के लिए! सबसे पहले लिंक से उन इकाइयों में अपनी खुद की विस्तारित विधियां बनाना संभव है जो SQL सर्वर में कोड निष्पादित करते हैं? अगर यह संभव है तो मुझे यह कैसे करना है?
आपकी मदद के लिए धन्यवाद।
आप उपयोग कर [ 'SqlMethods.Like'] (http कोशिश किया। microsoft.com/en-us/library/system.data.linq.sqlclient.sqlmethods.like.aspx)? – dasblinkenlight
@dasblinkenlight SqlMethods का उपयोग लिंक से एंटिटी में नहीं किया जा सकता है। –