كيف يمكنني إرسال المقارنة مخصص (تعريف للمشغل ثنائي المساواة) لكائن entityframework إلى int؟
سؤال
وأنا الحصول على هذا الخطأ:
<اقتباس فقرة>والسابقين = { "المشغل ثنائي لا يعرف تكافؤ" 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 يعرف بالفعل كيفية ترجمة السلاسل إلى أعضاء الممتلكات.