LINQ-TO-SQL: pencutequery (النوع، السلسلة) يملأ حقل واحد، ولكن ليس الآخر

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

سؤال

لقد كتبت تطبيقا استخدمه كوكيل لاستعلام البيانات من قاعدة بيانات وتحميله تلقائيا في ذاكرة التخزين المؤقت على الويب الموزعة.

أقوم بذلك عن طريق تحديد استعلام SQL ونوع في التكوين. الكود الذي يشبه الاستعلام في الواقع مثل هذا:

List<Object> result = null;
try { result = dc.ExecuteQuery(elementType, entry.Command).OfType<Object>().ToList(); }
catch (Exception ex) { HandleException(ex, WebCacheAgentLogEvent.DatabaseExecutionError); continue; }

elementType هو system.type تم إنشاؤها من النوع المحدد في التكوين (باستخدام Type.GetType())، و entry.Command هو استعلام SQL.

نوع الكيان المحدد الذي أواجه مشكلة بهذا الشكل:

public class FooCount
{
    [Column(Name = "foo_id")]
    public Int32 FooId { get; set; }

    [Column(Name = "count")]
    public Int32 Count { get; set; }
}

يبدو استعلام SQL مثل هذا:

select foo_id as foo_id, sum(count) as [count]
from foo_aggregates
group by foo_id
order by foo_id

لسبب ما، عند تنفيذ الاستعلام، ينتهي خاصية "Count" إنهاء الممتلكات "fooid". حاولت تشغيل الاستعلام بنفسي، ويتم إرجاع أسماء الأعمدة الصحيحة، وتتطابق أسماء الأعمدة مع ما حددته في سمات رسم الخرائط الخاصة بي. مساعدة!

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

المحلول

هذا جنون...

ما الثابت مشكلتي كان تزيين فئة كيائي مع TableAttribute:

[Table(Name = "foo_aggregates")]
public class FooCount
{
    [Column(Name = "foo_id")]
    public Int32 FooId { get; set; }

    [Column(Name = "count")]
    public Int32 Count { get; set; }
}

كنت قد افترضت (خطأ، على ما يبدو) لأنني لم أكن أستخدم GetTable<T>() الطريقة، لم أكن بحاجة إلى سمة التعيين المقابلة.

تحديث: في وقت لاحق سنويا ونصف، يبدو أخيرا، يبدو لي أنه يبدو أن زخارف العموديات على الخصائص يتم تجاهلها إلا إذا كان هناك زخرفة مقابلة Tableattribute على الفصل. هذا ما يفسر لماذا تمكنت "العد"، نظرا لأن تسميةها سيتطابق مع العمود في بيان SQL، في حين أن Fooid / Foo_id بالطبع لا تتطابق.

نصائح أخرى

يحتوي Linq إلى SQL على إعادة تعيين الوقت الصعب عندما تختلف أسماء الخصائص عن أسماء الأعمدة. حاول تغيير اسم الممتلكات الخاص بك إلى foo_id مع الشرطة السفلية. يجب أن الخدعة.

إما ذلك، أو يمكنك تغيير عبارة SELECT الخاصة بك إلى Foo_ID ك FOOID لتتناسب مع الممتلكات الخاصة بك. في كلتا الحالتين، يجب أن تكون هي نفسها (لا تحتاج إلى أن تكون نفس الحالة رغم ذلك).

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