كيف يمكنني إرسال المقارنة مخصص (تعريف للمشغل ثنائي المساواة) لكائن entityframework إلى int؟

StackOverflow https://stackoverflow.com/questions/1937072

سؤال

وأنا الحصول على هذا الخطأ:

<اقتباس فقرة>   

والسابقين = { "المشغل ثنائي لا يعرف تكافؤ" MySite.Domain.DomainModel.EntityFramework.NickName "أنواع و" System.Int32. "}

ما حاولت القيام به هو القيام تحديد كافة حيث NickNameId = someIntPassedIn ... المشكلة هي أن NickNameId هو المفتاح الخارجي، لذلك عندما يقارن someIntPassedIn إلى NickNameId فإنه يسحب الكائن NickName كله أن NickNameId يشير إلى ويحاول مقارنة الباحث إلى هذا الكائن.

وأنا في حاجة الى حل هنا لتمكينه من مقارنة كثافة لمعرف الكائن لقب في ... لذلك

وA) كيف يمكنني تحديد المشغل ثنائي المساواة لمقارنة هذه الكائنين

وOR

B) كيف يمكنني مقارنتها مباشرة إلى هوية بدلا من الكائن كله؟

وليس لديك لقراءة هذا، ولكن هنا طريقة SelectAllByKey طارئ أنه يساعد على:
(مررت في "NickNameId" و "1")

    public IList<E> SelectAllByKey(string columnName, string key)
    {
        KeyProperty = columnName;
        int id;
        Expression rightExpr = null;

        if (int.TryParse(key, out id))
        {
            rightExpr = Expression.Constant(id);
        }
        else
        {
            rightExpr = Expression.Constant(key);
        }

        // First we define the parameter that we are going to use the clause.
        var xParam = Expression.Parameter(typeof(E), typeof(E).Name);
        MemberExpression leftExpr = MemberExpression.Property(xParam, this._KeyProperty);
        int temp;
        BinaryExpression binaryExpr = MemberExpression.Equal(leftExpr, rightExpr);
        //Create Lambda Expression for the selection
        Expression<Func<E, bool>> lambdaExpr = Expression.Lambda<Func<E, bool>>(binaryExpr, new ParameterExpression[] { xParam });
        //Searching ....
        IList<E> resultCollection = ((IRepository<E, C>)this).SelectAll(new Specification<E>(lambdaExpr));
        if (null != resultCollection && resultCollection.Count() > 0)
        {
            //return valid single result
            return resultCollection;
        }//end if
        return null;
    }

واسمحوا لي أن أعرف إذا كنت بحاجة إلى أي مزيد من المعلومات.

شكرا،
مات

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

المحلول

ويجب أن ندعو SelectAllByKey('NickName.ID','1').

ومنذ ID هو ملك للممتلكات، هل يمكن استخدام هذا الأسلوب التمديد:

public static MemberExpression PropertyOfProperty(this Expression expr,string propertyName)
{           
    var properties = propertyName.Split('.');

    MemberExpression expression = null;

    foreach (var property in properties)
    {
        if (expression == null)
            expression = Expression.Property(expr, property);
        else
            expression = Expression.Property(expression, property);
    }

    return expression;
}

نصائح أخرى

والجواب المقبولة يبدو <م> الطريق معقدة للغاية بالنسبة للمشكلة المطروحة، إذا أنا أقرأ هذا بشكل صحيح.

إذا كنت فهمت بشكل صحيح، وكنت تحاول تشغيل استعلام مثل:

var q = from e in Context.SomeEntities
        where e.NickNameId == someIntPassedIn
        select e;

و... ولكن هذا لن ينجح، لأن e.NickNameId كيان، وليس صحيحا.

لمرجع الملكية Id، يمكنك الرجوع فقط إلى ذلك، مثل هذا:

var q = from e in Context.SomeEntities
        where e.NickNameId.Id == someIntPassedIn
        select e;

<القوي> تحديث: إذا كنت لا يمكن استخدام خصائص قوية كتبته بسبب مستواك من التجريد (في تعليقك)، ثم استخدم <لأ href = "http://msdn.microsoft.com /en-us/library/bb338811.aspx "يختلط =" noreferrer نوفولو "> الاستعلام باني طرق :

var q = (ObjectQuery<T>)Repository.SelectSomething();
return q.Where("it.NickName.Id = " + someIntPassedIn.ToString());

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top