استهلاك عمليات الخدمة لخدمة بيانات ADO.NET من عميل .NET
-
21-09-2019 - |
سؤال
أحاول إنشاء خدمة بيانات ADO.NET مع الكثير من الكيانات وبعض عمليات الخدمة. على جانب واحد ، قمت بإنشاء تطبيق ويب ASP.NET ، حيث يوجد نموذج بيانات ADO.NET وخدمة بيانات ADO.NET. على الجانب الآخر ، قمت بإنشاء تطبيق ويب ASP.NET ثانٍ يحتوي على مرجع خدمة إلى خدمة البيانات.
الكيانات تأتي بشكل جيد للغاية ، يمكنني استخدام LINQ لاسترداد البيانات التي أريدها:
TestEntities entities = new TestEntities(
new Uri("http://localhost/service/service.svc"));
var query = from customer in entities.Customers
where customer.ID == 1234
select customer;
query.ToList();
هذا يعمل. ومع ذلك ، فإن استرداد المعلومات من خلال عمليات الخدمة يهدئني تمامًا. رمز جانب خدمة البيانات:
public static void InitializeService(IDataServiceConfiguration config) {
config.SetEntitySetAccessRule("*", EntitySetRights.All);
config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
}
[WebInvoke]
public IQueryable<Customer> GetSomeCustomers() {
TestEntities entities = new TestEntities();
return from customer in entities.Customers
where customer.ID > 0 && customer.ID < 20
select customer;
}
عندما أضفت مرجع الخدمة إلى مشروع العميل الخاص بي ، لم تلتقط Visual Studio أي عمليات خدمة. أعلم أنه يمكنني الوصول إليها من خلال URIS المصنّعة وطريقة BegineXecute إما لكائن DataServiceContext أو كائن الاختبارات (في هذه الحالة) ، أو شيء من هذا القبيل ، لكن هذا ليس كيف أريده.
ما أريده هو استخدام LINQ للذهاب من خلال البيانات التي تم إرجاعها لعملية الخدمة. هل هذا ممكن؟ يجب أن يكون ، أليس كذلك؟
المحلول
أشياء بسيطة بمجرد أن تعرف.
فقط بعض الأشياء التي يجب معرفتها:
حاليًا DataServiceClientGenerator (الذي يستخدم EntityClassGenerator) لا يخلق طرقًا لعمليات الخدمة.
لا يتم دعم استخدام طريقة Createquery في السياق لعمليات الخدمة ، وهي تعمل حاليًا لأنه لا يوجد التحقق من صحة من جانب العميل لذلك (ستلاحظ أنه إذا كنت تستخدم CreateSequery ، تتم إضافة "()" إلى نهاية طريقة الاستعلام مثله "http: //localhost/service.svc/method ()؟ المعلمة = 2"، يمكنك استخدام Createquery ولكن لا ينصح به.
لا تُرجع جميع عمليات الخدمة قيمًا ، لكن في هذا المثال ، سأعرض فقط مثالًا على تلك التي تفعل ذلك.
public partial class NorthwindEntities
{
public IQueryable<Order> OrdersByRegion(int regionId)
{
return this.Execute<Orders>(new Uri(string.Format("{0}OrdersByCountry?regionId={1}", this.BaseUri, regionId), UriKind.RelativeOrAbsolute));
}
}
إذا كنت بحاجة إلى مزيد من المعلومات ، فلا تتردد في طرح أي أسئلة.
ملاحظة: على مثالك ، لا تحتاج إلى إنشاء سياق بيانات جديد على عملية الخدمة الخاصة بك (جانب الخادم) ، يحتوي DataService بالفعل على مرجع عند استدعاء الخدمة.
يمكنك بالفعل تجاوز إنشاء سياق البيانات على جانب الخدمة مثل هذا:
protected override NorthwindEntities CreateDataSource()
{
return new NorthwindEntities();
}