LINQ-to-entities জেনেরিক == workaround

আমার নিম্নলিখিত LINQ-to-entities প্রশ্ন আছে

IQueryable> GetFirstOperationsForEveryId
    (IQueryable> ItemHistory)
{
    var q = (from h in ItemHistory
             where h.OperationId ==
                (from h1 in ItemHistory
                 where h1.GenericId == h.GenericId
                 select h1.OperationId).Min()
             select h);
    return q;
}

ItemHistory is a generic query. It can be obtained in the following way

var history1 = MyEntitiySet1.Select(obj =>
    new History{ obj.OperationId, GenericId = obj.LongId });
var history2 = AnotherEntitiySet.Select(obj =>
    new History{ obj.OperationId, GenericId = obj.StringId });

In the end of all I want a generic query being able to work with any entity collection convertible to History.

সমস্যা হল অভ্যন্তরীণ প্রশ্নের জেনেরিক আইডির কারণে কম্পাইল না কোডটি পরিচালনা করে (অপারেটর '==' টাইপ 'টি' এবং 'টি' এর ক্রিয়াকলাপগুলিতে প্রয়োগ করা যাবে না)।

যদি আমি == থেকে h1 পরিবর্তন করি। জেনারিক আইডি। ইক্যুইয়ালস (এইচ। জেনারিক আইডি) আমি নিম্নলিখিত নোট সাপোর্টড এক্সক্সেশন পাইনি:

টাইপ করতে 'System.Int64' টাইপ করতে 'System.Object' টাইপ করতে অক্ষম। লিংকু থেকে এন্টিটি কেবলমাত্র এন্টি ডেটা মডেল আদিম ধরনের কাস্টিং সমর্থন করে।

আমি subquery পরিবর্তে গ্রুপিং করার চেষ্টা করেছি এবং ফলাফল যোগদান।

IQueryable> GetFirstOperationsForEveryId
    (IQueryable> ItemHistory)
{
    var grouped = (from h1 in ItemHistory
                   group h1 by h1.GenericId into tt
                   select new
                   {
                        GenericId = tt.Key,
                        OperationId = tt.Min(ttt => ttt.OperationId)
                   });

    var q = (from h in ItemHistory
             join g in grouped
                on new { h.OperationId, h.GenericId }
                equals new { g.OperationId, g.GenericId }
             select h);
    return q;
}

জেনারিক আইডগুলি সমান কীওয়ার্ডের তুলনায় তুলনা করা হয় এবং এটি কাজ করে তবে প্রকৃত ডেটা দিয়ে ক্যোয়ারীটি খুব ধীর (এটি ডেডিকেটেড পোস্টগ্রাস্ক সার্ভারে 11 ঘন্টার জন্য চলছে)।

বাইরের যেখানে বিবৃতি জন্য একটি সম্পূর্ণ অভিব্যক্তি নির্মাণ করার জন্য একটি বিকল্প আছে। কিন্তু কোড খুব দীর্ঘ এবং অস্পষ্ট হতে হবে।

LINQ-to-entities জেনেরিক্স সঙ্গে সমতা তুলনা জন্য কোন সহজ কাজকর্ম আছে?

2

4 উত্তর

এটি চেষ্টা করুন, আমি মনে করি অতিরিক্ত জিজ্ঞাসা/যোগদান ছাড়া আপনি যা চান তা অর্জন করা উচিত

IQueryable> GetFirstOperationsForEveryId
    (IQueryable> ItemHistory)
{
  var q = from h in ItemHistory
          group h by h.GenericId into tt
          let first = (from t in tt
                        orderby t.GenericId
                        select t).FirstOrDefault()
          select first;

  return q;
}
1
যোগ
বেশ মার্জিত সমাধান! কিন্তু দুর্ভাগ্যবশত এখনও Npgsql প্রয়োগ করা হয়নি (2.0.11.9২ হিসাবে)। System.Data.EntityCommandCompilationException: কমান্ড সংজ্ঞা প্রস্তুত করার সময় একটি ত্রুটি ঘটেছে। ---> System.NotImplemented ব্যতিক্রম: পদ্ধতি বা অপারেশন বাস্তবায়িত হয় নি। আমার প্রকৃত সমস্যা ছিল যে আমি সূচী তৈরি করতে ভুলে গেছি। এ কারণেই গ্রুপ + যোগদান প্রশ্ন 11 ঘন্টা কাজ করে। সূচক সঙ্গে এটি যুক্তিসঙ্গতভাবে দ্রুত সঞ্চালিত হয়।
যোগ লেখক Mike, উৎস

আপনি জেনেটিক এবং অপারেশনআইড সম্পত্তি প্রয়োগকারী একটি IItemHistory ইন্টেফেসের জন্য T তে জেনেরিক সীমাবদ্ধতাও নির্ধারণ করতে পারেন।

0
যোগ

আমার প্রশ্ন ইতিমধ্যে একটি সমাধান রয়েছে। দলের সাথে দ্বিতীয় পদ্ধতি + যোগদান ভালভাবে কাজ করে যদি টেবিল সঠিকভাবে সূচী হয় । ডাটাবেস টেবিলে থেকে 370k সারি পুনরুদ্ধার করতে 3.28 সেকেন্ড সময় লাগে। প্রকৃতপক্ষে অ জেনেরিক বৈকল্পিকের মধ্যে প্রথম প্রশ্নটি দ্বিতীয়টির চেয়ে পোস্টগ্রাস্কএল-এ ধীর। 26.68 সেকেন্ড vs 4.75।

0
যোগ
IQueryable> GetFirstOperationsForEveryId
(IQueryable> ItemHistory)
{
var grouped = (from h1 in ItemHistory
               group t by h1.GenericId into tt
               select new
               {
                    GenericId = tt.Key,
                    OperationId = tt.Min(ttt => ttt.OperationId)
               });

var q = (from h in ItemHistory
         join g in grouped
            on new { h.OperationId, h.GenericId }
            equals new { g.OperationId, g.GenericId }
         select h);
return q;
}
0
যোগ
আমি পোস্ট করেছি কি থেকে পার্থক্য কি?
যোগ লেখক Mike, উৎস