কেবলমাত্র আরম্ভকারী, সত্তা সদস্য এবং সত্তা নেভিগেশন বৈশিষ্ট্যগুলি সমর্থিত


102

আমি এই ব্যতিক্রম পাচ্ছি:

নির্দিষ্ট ধরণের সদস্য 'অর্থ প্রদান' লিনকু টু সত্তাগুলিতে সমর্থিত নয়। কেবলমাত্র আরম্ভকারী, সত্তা সদস্য এবং সত্তা নেভিগেশন বৈশিষ্ট্যগুলি সমর্থিত।

    public ActionResult Index()
    {
        var debts = storeDB.Orders
            .Where(o => o.Paid == false)
            .OrderByDescending(o => o.DateCreated);

        return View(debts);
    }

আমার মডেল ক্লাস

public partial class Order
{
    public bool Paid {
        get {
            return TotalPaid >= Total;
        }
    }

    public decimal TotalPaid {
        get {
            return Payments.Sum(p => p.Amount);
        }
    }

পেমেন্টগুলি ক্ষেত্রের পরিমাণ সম্বলিত একটি সারণী, আমি কীভাবে অর্থ প্রদানের বিষয়ে সঠিক তথ্য দেখাচ্ছে এমন ধারাটি সরিয়ে দিলে কোডটির সাথে কী সমস্যা আছে তা সরিয়ে দিলে কোয়েরিটি কাজ করে?

এর সাথে প্রস্তাবিত উত্তরের মতো সমাধান করা:

    public ActionResult Index()
    {
        var debts = storeDB.Orders
            .OrderByDescending(o => o.DateCreated)
            .ToList()
            .Where(o => o.Paid == false);

        return View(debts);
    }

15
সরল উত্তর: আপনি লিনাক-টু-সত্তা কোয়েরিতে ম্যাপড বৈশিষ্ট্যগুলি ব্যবহার করতে পারবেন না! কেবল ম্যাপযুক্ত বৈশিষ্ট্যগুলি এসকিউএল-তে অনুবাদ করা হয়।
লাডিস্লাভ মৃঙ্কা

উত্তর:


114

সত্তা আপনার প্রদত্ত সম্পত্তিটিকে এসকিউএলে রূপান্তর করার চেষ্টা করছে এবং এটি টেবিল স্কিমার অংশ নয় বলে পারে না।

আপনি যা করতে পারেন তা হ'ল সত্তাকে কোনও পেইড ফিল্টার ছাড়াই টেবিলটি জিজ্ঞাসা করতে দেওয়া এবং তারপরে পরিশোধিত নয় ফিল্টার আউট করা।

public ActionResult Index()
{
    var debts = storeDB.Orders
        //.Where(o => o.Paid == false)
        .OrderByDescending(o => o.DateCreated);

    debts = debts.Where(o => o.Paid == false);

    return View(debts);
}

অবশ্যই এটির অর্থ হ'ল আপনি সমস্ত ডেটা ওয়েব সার্ভারে ফিরিয়ে আনতে এবং এতে ডেটা ফিল্টার করছেন। আপনি যদি ডিবি সার্ভারে ফিল্টার করতে চান তবে আপনি টেবিলে একটি গণিত কলাম তৈরি করতে পারেন বা একটি সঞ্চিত পদ্ধতি ব্যবহার করতে পারেন।


25

ঠিক একই ধরণের সমস্যা সমাধান করতে হয়েছিল। উপরের সমাধানগুলিতে মেমোরি প্রসেসিং প্রয়োজন যা একটি খারাপ অভ্যাস (অলস লোডিং)।

আমার সমাধানটি হ'ল এমন কোনও সহায়তাকারী লিখুন যা কোনও শিকারীকে ফিরিয়েছিল:

public static class Extensions
{
    public static Expression<Func<Order, bool>> IsPaid()
    {
        return order => order.Payments.Sum(p => p.Amount) >= order.Total;
    }
}

আপনি আপনার লিনাক স্টেটমেন্টটি আবার লিখতে পারেন:

var debts = storeDB.Orders
                    .Where(Extensions.IsPaid())
                    .OrderByDescending(o => o.DateCreated);

আপনি গণনার লজিক (ডিআরওয়াই) পুনরায় ব্যবহার করতে চাইলে এটি কার্যকর। ডাউনসাইড হ'ল যুক্তিটি আপনার ডোমেন মডেলটিতে নেই।


1
এখানে অনেকগুলি লাইব্রেরি রয়েছে যা এই পদ্ধতিকে আরও "অন্তর্নির্মিত" দেখুন: stackoverflow.com/a/27383641/470183 দেখুন । লিনাক-টু-সত্তা "ক্যানোনিকাল ফাংশন" - যা এসকিউএলে রূপান্তরিত হতে পারে তা ব্যবহার করেই সীমাবদ্ধ। সি # 6 "এক্সপ্রেশন বডিড ফাংশন" প্রবর্তন করেছে তবে এগুলি সত্য ল্যাম্বডাস নয় (দেখুন: stackoverflow.com/a/28411444/470183 )। তবুও এটি কাঠামোর মধ্যে রাখা ভাল হবে তাই ডাব্লুআইবিএনআই ডেটা.সুর্জনস
জেমস বন্ধ করুন

1
এর এই সহজ এবং সংক্ষিপ্ত উদাহরণের জন্য আপনাকে ধন্যবাদ Expression<Func<xx,yy>>। আমি এটি আগে কখনও বুঝতে পেরেছি, তবে এটি এখন সুস্পষ্ট বলে মনে হচ্ছে।
অ্যালেক্সবি

17

এই সমস্যাটি এমন কোনও [NotMapped]সম্পত্তি থেকেও আসতে পারে যা আপনার ডিবি মডেল এবং দেখুন মডেলের একই নাম রয়েছে।

অটোম্যাপার একটি প্রক্ষেপণের সময় এটি ডিবি থেকে নির্বাচন করার চেষ্টা করে; এবং নোটম্যাপড সম্পত্তি স্পষ্টতই ডিবিতে নেই।

সমাধান হয় IgnoreAutoMapper কনফিগ যখন ডিবি মডেল থেকে দেখুন মডেল থেকে ম্যাপিং সম্পত্তি।

  1. আপনার ডিবি মডেলের [NotMapped]নামের সাথে একটি সম্পত্তি Fooঅনুসন্ধান করুন।
  2. Fooআপনার ভিউ মডেলে একই নামের একটি সম্পত্তি অনুসন্ধান করুন।
  3. যদি এটি হয় তবে আপনার অটোম্যাপার কনফিগারেশনটি পরিবর্তন করুন। যোগ.ForMember(a => a.Foo, b => b.Ignore());

ডাং অটোম্যাপার প্রজেকশন আমাকেও ধরে ফেলল, উত্তরের জন্য ধন্যবাদ!
চেজ ফ্লোরেল

15

লিনক স্টেটমেন্টগুলিকে এসকিউএল স্টেটমেন্টে রূপান্তর করে এবং সেগুলি ডাটাবেসে চালিত করে।

এখন, এই রূপান্তরটি কেবলমাত্র সত্তা সদস্য, আরম্ভকারী এবং সত্তা নেভিগেশন বৈশিষ্ট্যের জন্য ঘটে। সুতরাং ফাংশন অর্জন করতে বা সম্পত্তি তুলনা পেতে, আমাদের প্রথমে তাদের মেমরি তালিকার মধ্যে রূপান্তর করতে হবে এবং তারপরে ডেটা পুনরুদ্ধারে ফাংশন প্রয়োগ করতে হবে।

সুতরাং সামগ্রিকভাবে,

var debts = storeDB.Orders.toList()
        .Where(o => o.Paid == false)
        .OrderByDescending(o => o.DateCreated);

21
আমি পরামর্শ দিয়েছি যে কাউকে আদেশে টোলিস্ট () তৈরি করতে বলা বিপজ্জনক কারণ এর অর্থ পুরো তালিকাটি পুনরুদ্ধার করা হবে
এলগ্রেগো

এটি আমার পক্ষে ভাল কারণ আমার সমস্যাযুক্ত সম্পত্তি হুম ক্লজটিতে নেই এমন একটি লিনাক ফাংশনে রয়েছে। সুতরাং আমি অপ্রয়োজনীয় ডেটা পাচ্ছি না এবং পুনরুদ্ধার করা তথ্যে আমি লিনক সামের কাজটি করছি যা তালিকায় কাজ করছে। ধন্যবাদ! প্রথমে যা খারাপ দেখায় তা নির্দিষ্ট পরিস্থিতিতে খুব সহায়ক হতে পারে!
ডভ মিলার

11

অন্য সম্ভাব্য কারণ হ'ল আপনি IEnumerableআপনার সম্পত্তিটির পরিবর্তে ব্যবহার করছেনICollection

এর পরিবর্তে:

public class This
{
    public long Id { get; set; }
    //...
    public virtual IEnumerable<That> Thats { get; set; }
}

এটা কর:

public class This
{
    public long Id { get; set; }
    //...
    public virtual ICollection<That> Thats { get; set; }
}

আর আপনি দুষ্টু ডোরী ... 2 ঘন্টা হারিয়ে যাওয়ার মতো বোকা জিনিস।


2

আপনি যদি স্বাক্ষরবিহীন ইন্টির মতো এন্টি ফ্রেমওয়ার্কের ধরণগুলি দ্বারা অসমর্থিত ব্যবহার করেন তবে এই পরিস্থিতিটিও ঘটতে পারে ।

এটি আমার যেমন ত্রুটির ঘটনা ছিল।

সমর্থিত প্রকারের বিষয়ে আরও তথ্যের জন্য চেকআউট করুন: https://msdn.microsoft.com/en-us/library/ee382832(vvv.1.100).aspx

GFoley83 দ্বারা ব্যাখ্যা করা, এই জাতীয় পরিস্থিতিতে কিছুটা সমাধান রয়েছে: সত্তা ফ্রেমওয়ার্কের সাথে স্বাক্ষরযুক্ত / দীর্ঘতর টাইপ কীভাবে ব্যবহার করবেন?


এই লিঙ্কটি বেশ সময় সাশ্রয়! আপনাকে অনেক ধন্যবাদ!
ভ্লাদিমির সেমাশকিন

0

আমি এই সমস্যার মুখোমুখি হয়েছিল কারণ কেবলমাত্র get without setসম্পত্তি সহ সদস্যের পরিবর্তনশীল ছিল

এর অর্থ এটি auto calculatedএবং এর not storedমধ্যে একটি কলামthe table

সুতরাং এটি not existএর মধ্যেtable schema

তাই make sureযে কোনো সদস্য পরিবর্তনশীল not auto calculatedকরার haveএকটি getterএবং setterবৈশিষ্ট্য


-1

আপনার এডিএমএক্স এবং প্রসঙ্গে মডেলটির কিছু পৃথক সম্পত্তি রয়েছে যা ডিবিতে নতুন যুক্ত হয়েছে।

আপনার EDMX এটিকে রিফ্রেশ করুন সঠিকভাবে আপডেট করুন আপনার প্রকল্পটি বুলি করুন এবং আবার চালান।

এটি আপনার সমস্যা সমাধান করবে।

শুভেচ্ছা, গণেশ নিকম

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.