একটি লিনাক সিলেক্টে একটি টিপল তৈরি করুন


89

আমি সি # এবং .NET ফ্রেমওয়ার্ক 4.5.1 এটিটি ফ্রেমওয়ার্ক 6.1.3 সহ এসকিউএল সার্ভার ডাটাবেস থেকে ডেটা পুনরুদ্ধার করছি।

আমার আছে এটা:

codes = codesRepo.SearchFor(predicate)
      .Select(c => new Tuple<string, byte>(c.Id, c.Flag))
      .ToList();

এবং যখন আমি এটি চালনা করি, আমি এই বার্তাটি পাই:

কেবলমাত্র প্যারামিটারলেস কনস্ট্রাক্টর এবং ইনিশিয়ালাইজারগুলি লিনকু থেকে সত্তাগুলিতে সমর্থিত।

আমি জানি না কীভাবে আমাকে টুপল তৈরি করতে হবে কারণ আমি যে উদাহরণগুলি পেয়েছি সেগুলি বেশিরভাগের মতো।

আমি এটি চেষ্টা করেছি:

codes = codesRepo.SearchFor(predicate)
      .Select(c => Tuple.Create(c.Id, c.Flag))
      .ToList();

এবং এই ত্রুটিটি পান:

সংস্থাগুলিতে লিনকিউ 'সিস্টেম.টুপ্লিপ 2 [সিস্টেম.স্ট্রিং, সিস্টেম.বাইট] [স্ট্রিং, বাইট] (সিস্টেম.স্ট্রিং, বাইট)' পদ্ধতিটি তৈরি করে না এবং এই পদ্ধতির কোনও স্টোর এক্সপ্রেশন হিসাবে অনুবাদ করা যায় না।

সমস্যা কোথায়?


দেখে মনে হচ্ছে আপনার একটি দৃ strongly়ভাবে টাইপ করা অবজেক্ট তৈরি করা দরকার। তবে হ্যাঁ, ভাল প্রশ্ন; upvated।
ফরাসী

উত্তর:


121

যদিও উত্তর দ্বারা octavioccl কাজ, এটি প্রথম প্রকল্প ভাল বেনামী ধরনের মধ্যে ক্যোয়ারী ফলাফল, এবং তারপর গণনীয় এবং এটি tuple রূপান্তর স্যুইচ করুন। এইভাবে আপনার ক্যোয়ারী কেবলমাত্র প্রয়োজনীয় ক্ষেত্রগুলির ডেটা বেস থেকে পুনরুদ্ধার করবে।

codes = codesRepo.SearchFor(predicate)
    .Select(c => new { c.Id, c.Flag })
    .AsEnumerable()
    .Select(c => new Tuple<string, byte>(c.Id, c.Flag))
    .ToList();

দ্রষ্টব্য: উপরের বিধিটি EF6 এর ক্ষেত্রে প্রযোজ্য। ইএফ কোর স্বাভাবিকভাবেই টুপল কনস্ট্রাক্টরের মাধ্যমে টিপলসকে (প্রক্ষেপণে বা যোগদানের / গ্রুপ কী হিসাবে) সমর্থন করে, যেমন মূল কোয়েরিটি কেবল কাজ করে

codes = codesRepo.SearchFor(predicate)
  .Select(c => new Tuple<string, byte>(c.Id, c.Flag))
  .ToList();

তবে Tuple.Createপদ্ধতিটি নয় (EF কোর 2.x)।


খুব ভাল সমাধান - ধন্যবাদ! ... যদি আমি এই সমাধানটি অন্য একটি অবিরাম মান দ্বারা প্রসারিত করতে পারি তবে কী হবে? .Select(c => new { c.Id, c.Flag, c.Foo?.Code })কাজ করে না.
স্কাইফ্রোগ

4
@skyfrog অপারেটরটি ?.এক্সপ্রেশন ট্রিগুলিতে সমর্থিত নয়। তবে এগুলি বাদ দিয়ে আপনি বেনামি ধরণটি আপনার পছন্দ মতো অনেকগুলি আকারের সাথে প্রসারিত করতে পারেন - প্রয়োজনের সময় তাদের নামটি ভুলে যাবেন না :) উদাহরণস্বরূপc => new { c.Id, c.Flag, Code = (int?)c.Foo.Code }
ইভান স্টয়েভ

4
দুর্দান্ত! আপনার উত্তরের জন্য অনেক ধন্যবাদ @ ইভান আমি এত কাছে ছিলাম! ... কিন্তু এটা সবসময় সহজ ফিরে ;-) খুঁজছেন যখন বলতে হয়
skyfrog

গ্রেট উত্তর, মতিন-সংস্থাগুলো সাথে ব্যবহার করা যাবে .. যেমন dbCtx.MyEntity.Where () নির্বাচন করুন (.. বেনামা বস্তুর ... করা) ইত্যাদি
joedotnot

50

সি # 7 এর জন্য কেবল একটি আপডেট হওয়া উত্তর, এখন আপনি ভ্যালুআপসগুলি তৈরি করতে একটি সহজ বাক্য গঠন ব্যবহার করতে পারেন।

codes = codesRepo.SearchFor(predicate)
.Select(c => new { c.Id, c.Flag })
.AsEnumerable()
.Select(c => (c.Id, c.Flag))
.ToList();

আপনি এমনকি টিপলের বৈশিষ্ট্যগুলি এখনই নামকরণ করতে পারেন:

codes = codesRepo.SearchFor(predicate)
.Select(c => new { c.Id, c.Flag }) // anonymous type
.AsEnumerable()
.Select(c => (Id: c.Id, Flag: c.Flag)) // ValueTuple
.ToList();

সুতরাং এটি আইটেম 1 বা আইটেম 2 হিসাবে ব্যবহার না করে আপনি এটি আইডি বা পতাকা হিসাবে অ্যাক্সেস করতে পারেন।

বেনামে-এবং-টিউপল-এর ​​মধ্যে-বেছে নেওয়ার বিষয়ে আরও ডক্স


11

এটা চেষ্টা কর:

codes = codesRepo.SearchFor(predicate)
  .Select(c => Tuple.Create(c.Id, c.Flag))
  .ToList();

এটি অবহিত হয়ে গেছে যে এটি সত্তাগুলিতে লিনকিউ-তে গ্রহণ করছে না।

আরেকটি বিকল্প হ'ল ফলাফলটি নির্বাচনের আগে মেমরিটিতে টানা। আপনি যদি এটি করতে যাচ্ছেন তবে আমি সমস্ত ফিল্টারিংয়ের আগে সুপারিশ করবো .AsE গুণমান () এর অর্থ হল আপনি কেবল ফলাফলগুলি টানছেন যা আপনি পুরো টেবিলটি পিছনে টানতে এবং তারপরে ফিল্টারিংয়ের বিপরীতে চান।

codes = codesRepo.SearchFor(predicate).AsEnumerable()
  .Select(c => Tuple.Create(c.Id, c.Flag))
  .ToList();

পাশাপাশি টিপলস.ক্রিয়েট (সি.আইডি, সি.ফ্লেগ) নতুন টিপল (সি.আইডি, সি.ফ্লেগ) এ পরিবর্তন করা যেতে পারে যদি আপনি টিপলসের ধরণের কোডগুলিকে কিছুটা আরও সুস্পষ্ট করতে চান


দুঃখিত, এটি কাজ করে না। আমি আরও বিশদ সহ আমার প্রশ্ন আপডেট করেছি।
ভ্যানসফ্যানেল

10

ইন সত্ত্বা থেকে linq আপনি একটি বেনামী টাইপ সম্মুখের বা DTO.To এড়ানোর যে ইস্যু আপনি ব্যবহার করতে পারেন সম্মুখের প্রকল্প করতে AsEnumerableএক্সটেনশন পদ্ধতি:

codes = codesRepo.SearchFor(predicate).AsEnumerable().
      .Select(c => new Tuple<string, byte>(c.Id, c.Flag))
      .ToList();

এই পদ্ধতিটি আপনাকে লিনাক টু অবজেক্টের পরিবর্তে লিনাক টু সত্তাগুলির সাথে কাজ করতে দেয় , সুতরাং এটি কল করার পরে আপনি আপনার ক্যোয়ারির ফলাফলটি যা যা প্রয়োজন তা প্রজেক্ট করতে পারেন AsEnumerableinstead পরিবর্তে ব্যবহার করার সুবিধাটি ToListহ'ল ক্যোরিটি AsEnumerableকার্যকর করা হয় না, এটি স্থগিত মৃত্যুদন্ড সংরক্ষণ করে। এই পদ্ধতিগুলির মধ্যে একটি কল করার আগে সর্বদা আপনার ডেটা ফিল্টার করা ভাল ধারণা।


-1 এটি ওপি-র অনুরোধ অনুযায়ী একই কাজ করে না। যোগদানের উদ্দেশ্যে, কখনও কখনও, কোয়েরিতে টিপলস তৈরি করতে সক্ষম হওয়া গুরুত্বপূর্ণ।
আরন


1

এটি করার জন্য এই পদ্ধতিটি ব্যবহার করুন এবং অ্যাসিঙ্কটি ব্যবহার করুন।

var codes = await codesRepo.SearchFor(predicate)
                    .Select(s => new
                    {
                        Id = s.Id,
                        Flag = s.Flag
                    }).FirstOrDefaultAsync();

                var return_Value = new Tuple<string, byte>(codes.Id, codes.Flag);

0

কেবল আমার দুটি সেন্ট: এটি টাইপের নামগুলি সহ আমাকে কয়েকবার ধরা দিয়েছে:

কয়েকটি নোডির উদাহরণ:

    private Tuple<string, byte> v1()
    {
        return new Tuple<string, byte>("", 1);
    }

    private (string, int) v2()
    {
        return ("", 1);
    }

    private (string Id, byte Flag) v3()
    {
        return ("", 1);
    }

শ্রদ্ধা।


আপনার পোস্ট করা সিনট্যাক্সটি কাজ করে না। আপনি সম্ভবত যা লিখতে চেয়েছিলেন তা হ'ল public (string Id, byte Flag) SearchFor(Expression predicate)তবে এটি মূল বিষয়টির পাশে। দুটি সেন্টের উত্তর হওয়া উচিত নয়, তবে একটি মন্তব্য।
এম.স্ট্রাম্ম

4
আমি আমার উত্তর আপডেট করেছি - পোস্ট করার আগে আমার এটি পরীক্ষা করা উচিত ছিল। আমি দ্বিমত পোষণ করি; সমস্ত পৃষ্ঠাগুলি এই পৃষ্ঠায় অবতরণকারী সকল দর্শনার্থীর পক্ষে এটির পোস্ট নির্বিশেষে কার্যকর। মন্তব্যগুলি উত্তরের পাশাপাশি উত্তরগুলির জন্য ধন্যবাদ জানায় না।
ইব্রার মমতাজ

আমি সম্মত হই যে যুক্ত হওয়া সামগ্রীগুলি ভাল এবং মন্তব্যগুলি উদাহরণের উদাহরণগুলিতে ভালভাবে পরিপূর্ণ হয় না। সম্পাদনা করার জন্য ধন্যবাদ, এখন এটি স্পষ্ট হয়ে গেছে যে এটি ওপি-র প্রশ্নের উত্তর নয় (তবে টিপল সম্পর্কিত সমস্যার ক্ষেত্রে সহায়তা করতে পারে)।
এম স্ট্রামম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.