c# مسار لينق، الكيان الذي ينفذ واجهة والاستثناء في رسم الخرائط




كيفية عمل خريطة لمكان (4)

لترجمة استعلام لينق إلى سكل الفعلي، ينقح Linq2SQL التعبير الذي تعطيه. المشكلة هي أنك لم توفر معلومات كافية ل L2S لتكون قادرة على ترجمة الخاصية "إد" إلى اسم العمود دب الفعلي. يمكنك تحقيق ما تريد من خلال التأكد من أن L2S يمكن تعيين "إد" إلى "إدفيلد".

وينبغي أن يكون ذلك ممكنا باستخدام النهج الوارد في الإجابات.

إذا كنت تستخدم المصمم، يمكنك أيضا إعادة تسمية الخاصية فئة "إدفيلد" إلى "إد"، مع فائدة إضافية أنك لن تضطر إلى تنفيذ صريح الخاصية "إد" في صفك الجزئي بعد الآن، أي الطبقة الجزئية تعريف ل مينتيتي ببساطة يصبح:

public partial class MyEntity: IEntity 
{    
}

أنا باستخدام نمط مستودع التخزين مع لينق، يكون IRiepository.DeleteOnSubmit (T الكيان). يعمل بشكل جيد، ولكن عندما يكون الكيان فئة واجهة، مثل هذا:

public interface IEntity { int ID {get;set;} }

public partial class MyEntity: IEntity {

    public int ID { 
        get { return this.IDfield; }
        set { this.IDfield=value;  }
    }
}

ومن ثم محاولة حذف بعض الكيان مثل هذا:

IEntity ie=repository.GetByID(1);
repoitory.DeleteOnSubmit(ie);

يلقي
العضو 'IEntity.ID' ليس لديه ترجمة معتمدة إلى سكل.

جلب البيانات من دب يعمل، ولكن حذف وإدراج لا. كيفية استخدام واجهة ضد داتاكونتيكست؟

ها هو:
رسالة الاستثناء: لا يحتوي العضو 'MMRI.DAL.ITag.idContent' على ترجمة معتمدة إلى سكل.

الشفرة:

var d = repContent.GetAll().Where(x => x.idContent.Equals(idContent));
foreach (var tagConnect in d)    <- error line
{
    repContet.DeleteOnSubmit(tagConnect);

(يحصل على كافة العلامات من دب، وحذفها)

وتتبع المكدس:

[NotSupportedException: The member 'MMRI.DAL.ITag.idContent' has no supported translation to SQL.]
   System.Data.Linq.SqlClient.Visitor.VisitMember(SqlMember m) +621763
   System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) +541
   System.Data.Linq.SqlClient.SqlVisitor.VisitExpression(SqlExpression exp) +8
   System.Data.Linq.SqlClient.SqlVisitor.VisitBinaryOperator(SqlBinary bo) +18
   System.Data.Linq.SqlClient.Visitor.VisitBinaryOperator(SqlBinary bo) +18
   System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) +196
   System.Data.Linq.SqlClient.SqlVisitor.VisitExpression(SqlExpression exp) +8
   System.Data.Linq.SqlClient.SqlVisitor.VisitSelectCore(SqlSelect select) +46
   System.Data.Linq.SqlClient.Visitor.VisitSelect(SqlSelect select) +20
   System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) +1024
   System.Data.Linq.SqlClient.SqlProvider.BuildQuery( ...

عندما أحاول القيام تزيين الطبقة الجزئية:

[Column(Storage = "_idEvent", DbType = "Int NOT NULL", IsPrimaryKey = true)]
public int idContent
{ get { return this.idEvent; } set { this.idEvent=value; } }

فإنه يلقي خطأ "اسم عمود غير صالح" إدكونتنت "."


يبدو مايكروسوفت إسقاط الدعم لمشغل == في واجهات عند استخدام لينق إلى سكل في MVC4 (أو ربما لم يكن معتمدا). ولكن يمكنك استخدام i.ID.Equals(someId) بدلا من المشغل == .

صب IQueryable للعمل IEnumerable ولكن لا ينبغي أن تستخدم! والسبب هو: IQueryable ديه غير تقليدي تنفيذ IEnumerable . مهما كانت طريقة لينق التي سوف تستخدمها على IQueryable خلال واجهة IEnumerable سوف يسبب الاستعلام ليتم تنفيذها أولا، وجميع النتائج التي تم جلبها إلى الذاكرة من دب وتشغيل في نهاية المطاف لوكالي على البيانات (عادة تلك الأساليب سوف تترجم إلى سكل وتنفيذها في دب). تخيل في محاولة للحصول على صف واحد من جدول يحتوي على مليار صف، جلب كل منهم فقط لاختيار واحد (ويزداد سوءا مع الصب الإهمال من IQueryable ل IEnumerable وكسول تحميل البيانات ذات الصلة).

على ما يبدو لينق لا يوجد لديه مشكلة باستخدام == المشغل مع واجهات على البيانات المحلية (لذلك يتأثر فقط متضرر) وأيضا مع أطر الكيان (أو حتى سمعت).


هذا يعمل بالنسبة لي -

public partial class MyEntity: IEntity 
 {    [Column(Name = "IDfield", Storage = "_IDfield", IsDbGenerated = true)]
      public int ID 
       {         
          get { return this.IDfield; }        
          set { this.IDfield=value;  }    
       } 
 }

جرب هذا:

using System.Data.Linq.Mapping;

public partial class MyEntity: IEntity 
 {    [Column(Storage="IDfield", DbType="int not null", IsPrimaryKey=true)]
      public int ID 
       {         
          get { return this.IDfield; }        
          set { this.IDfield=value;  }    
       } 
 }




repository