سؤال

أنا باستخدام نهج مماثل إلى الآخرين فى الحفاظ على LINQ الكائنات في LINQ موفر البيانات و إعادة IQueryable للسماح تصفية الخ.هذا يعمل بشكل جيد لتصفية كائن بسيط من الهوية أو غيرها من الممتلكات, ولكن أواجه مشكلة مع انضمام الجدول الكائن الذي يتكون من طفل آخر الأشياء

    //CoreDBDataContext db = coreDB;
public IQueryable<DTO.Position> GetPositions()    {
     return from p in coreDB.Positions
         select new DTO.Position
             {
             DTO.User = new DTO.User(p.User.id,p.User.username, p.User.firstName,p.User.lastName,p.User.email,p.User.isActive),
             DTO.Role = new DTO.Role(p.Role.id, p.Role.name, p.Role.isActive),
             DTO.OrgUnit = new DTO.OrgUnit(p.OrgUnit.id,p.OrgUnit.name,p.OrgUnit.isActive)
             };

على coreDB.المواقف هو Linq الموقف الكائن وأنا العودة DTO الموقف الذي يتكون من المستخدم ، OrgUnit و دور (الجدول المصدر هو الانضمام إلى طاولة المفاوضات مع المستخدم أو رقم تعريف role ، OrgUnitID)

المشكلة أواجه هو أنه عندما كنت في محاولة لإضافة عامل تصفية على Iqueryable أحصل على خطأ SQL قائلا أنه لا توجد ترجمة المتاحة بلدي DTO.كائن المستخدم

public static IQueryable<Position> WithUserID(this IQueryable<Position> query, int userID)
    {
        return query.Where(p => p.User.ID == userID);
    }

أنا في حيرة كاملة عن كيفية التوجه نحو حل هذا النحو من نتائج جوجل يبدو أن يكون مع الناس الذين يعملون مباشرة مع إنشاء الكائنات LINQ

أي التفكير في كيفية جعل هذا العمل, أو أفعل شيء خاطئ تماما هنا ؟

شكرا

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

المحلول 3

وانتهى بي الأمر لا تستخدم المرشحات لبلدي الاستفسارات المعقدة. بدلا من ذلك، أضفت الطرق إلى المخزون لتلبية احتياجات الاستعلام أكثر تعقيدا. أشعر بأن هذا سيجعل النظام أسهل للفهم، وبالتالي الحفاظ عليها.

نصائح أخرى

لقد كنت قادرا على العمل بنجاح مع نهج مماثل:

var courses = from c in Map(origCourses)
where !expiredStatuses.Contains(c.Status)
select c;

حيث خريطة:

    select new UserCourseListItem
    {
        CourseID = c.CourseID,
        CourseName = cm.CourseName,
        CourseType = c.CourseType.Value
        ...

ماذا عن تجربة مع هذا النوع من التهيئة (بدلا من المنشئات).

Ps.هذا هو جزء من تطبيق العمل ، expiredStatuses بل هو ذات الصلة إلى مجمع التعبير.

تحديث 1: هذا هو مماثل مقارنة مع ذكر السيناريو, لأن:

  • خريطة إعادة IQueryable ، وهو بوكو الكائن.
  • بعد استدعاء خريطة الطريقة التي بإرجاع IQueryable مع بوكو كائن أنا تطبيق مرشح ضد ذلك.

Linq2SQL لا نفهم فقط مصمم من إنشاء الكائنات.حسنا, هذا ليس صحيحا تماما ، ولكن قريبة بما فيه الكفاية.

لذلك عند كتابة استعلامات Linq امام نظيره Linq2SQL الكائنات الاستعلام سيتم تحويلها إلى SQL صالح عند الاستعلام تنفيذ في الواقع لا مكتوبة.منذ DTO الكائنات ليست Linq2SQL الكائنات ، Linq2SQL لا تعرف كيفية إنشاء السليم SQL.

إذا كنت تريد أن تبقى الخاص بك الانفصال بهذه الطريقة, عليك أن تجد وسيلة لتنفيذ الاستفسارات الخاصة بك مع فقط Linq2SQL الكائنات المعنية فقط خريطة النتيجة إلى DTOs.

ربما يمكنك كتابة الاستعلام الخاص بك طريقة:

تحديث: المعلمة يجب أن تكون من نوع Expression<>, و هناك حاجة إلى إعادة IQueryable<>.شكرا فريدي لافتا.

public IEnumerable<DTO.Position> FindPositions(Expression<Func<Position, bool>> criteria)
{
    return from p in coreDB.Positions
           where criteria.Invoke(p)
           select new DTO.Position
                      {
                          User = new DTO.User(p.User.id, p.User.username, p.User.firstName, p.User.lastName,
                                       p.User.email, p.User.isActive),
                          Role = new DTO.Role(p.Role.id, p.Role.name, p.Role.isActive),
                          OrgUnit = new DTO.OrgUnit(p.OrgUnit.id, p.OrgUnit.name, p.OrgUnit.isActive)
                      };
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top