LINQ-TO-SQL: pencutequery (النوع، السلسلة) يملأ حقل واحد، ولكن ليس الآخر
-
09-09-2019 - |
سؤال
لقد كتبت تطبيقا استخدمه كوكيل لاستعلام البيانات من قاعدة بيانات وتحميله تلقائيا في ذاكرة التخزين المؤقت على الويب الموزعة.
أقوم بذلك عن طريق تحديد استعلام 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 لتتناسب مع الممتلكات الخاصة بك. في كلتا الحالتين، يجب أن تكون هي نفسها (لا تحتاج إلى أن تكون نفس الحالة رغم ذلك).