سؤال

ولدي هذا:

var sortName = Request.Params["sortName"];
var query = Request.Params["query"];

Func<UsuarioEndereco, bool> whereClause = (uen => uen.GetPropValue<string>(sortName).Contains(query));

وسيتم تعبئة "uen.GetPropValue<string>(sortName)" حيوي مع sortName المستخدم كتبته في الصفحة.

وعلى سبيل المثال، إذا نظر المستخدم لشخص يدعى "جو"، والمتكررة على النحو التالي:

(uen => uen.namePerson.Contains(Joe))

ولكن، أواجه مشاكل مع LINQ البحث حالة حساسة. إذا كنت اكتب "جو"، وأنا شيء. من ناحية أخرى، إذا كنت اكتب "جو"، فإنه يجلب شيئا.

وكيف يمكنني أن أجعل هذا "يحتوي على (sortName)" يعمل مع تحسس حالة الأحرف ؟؟ لقد حاولت بعض الأشياء مع String.Comparer ولكن تقارير الأخطاء على حل بناء.

والشكر !!

هل كانت مفيدة؟

المحلول

وأعتقد أن يلي توليد SQL المناسبة:

 uen=>(uen.GetPropValue<string>(sortName)).ToLower().Contains(query.ToLower()))

نصائح أخرى

وإذا كان هذا هو حقا-LINQ إلى SQL، حاول استخدام في SqlMethods.Like طريقة بدلا من String.Contains.

ولكن، أعتقد أن المشكلة هي أن هذا ليس LINQ إلى SQL، لأنك تستخدم المندوبين بدلا من أشجار التعبير. العميل لذلك هذا هو إحضارهم، ثم أعدم محليا ( "LINQ إلى كائنات"). وبالتالي، String.Contains تفعل ما تقوم به محليا.

في هذا الطريق، والإجابة جيمس هو الصحيح، إذ انه يدعو ToLower () على كل من قيمة والاستعلام. (على الرغم من الحذر من قضايا الثقافة - ربما تحديد أي ثقافة تريد)

ويمكنك أيضا استخدام أسلوب String.IndexOf (سلسلة، Int32، StringComparison) (<لأ href = "http://msdn.microsoft.com/en-us/library/ms224424.aspx" يختلط = "نوفولو" > http://msdn.microsoft.com/en-us/library/ms224424.aspx ). هذا الأسلوب يسمح لك بتحديد ما إذا كان ينبغي أن يتم مطابقة حالة حساسية أم لا، وإذا كان ينبغي استخدام الثقافة ثابتة أم لا.

وهكذا في المثال الخاص بك:

Func<UsuarioEndereco, bool> whereClause = (uen => uen.GetPropValue<string>(sortName).IndexOf(query, 0, StringComparison.OrdinalIgnoreCase));

وأنا لا يعلق على ما إذا كان هذا هو الحل أفضل من التي قدمها جيمس كوران. ما في وسعها أو لا يمكن أن يكون، والأداء الحكمة.

وهذا هو رمز كامل:

var sortOrder    = Request.Params["sortorder"];    
var sortName     = Request.Params["sortname"];
var query        = Request.Params["query"];

IEnumerable<UsuarioEndereco> pagedEndereco;

Func<UsuarioEndereco, bool> whereClause = (uen => uen.GetPropValue<string>(sortName).Contains(query));
pagedEndereco = sortOrder.Equals("asc", StringComparison.CurrentCultureIgnoreCase) ?
                        _agendaServico.SelecionaUsuarioEnderecos(u.codUsuario).Where(whereClause).OrderByDescending(uen => uen.GetPropValue<IComparable>(sortName)) :
                        _agendaServico.SelecionaUsuarioEnderecos(u.codUsuario).Where(whereClause).OrderBy(uen => uen.GetPropValue<IComparable>(sortName));

وأسلوب الإرشاد GetPropValue هو:

public static T GetPropValue<T>(this object component, string propertyName)
{
    return (T)TypeDescriptor.GetProperties(component)[propertyName].GetValue(component);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top