سؤال

أحاول إنشاء خدمة بيانات 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();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top