সত্তাটি লিনকিউ থেকে সত্তা কোয়েরিতে তৈরি করা যায় না


389

পণ্য নামে একটি সত্তার ধরণ রয়েছে যা সত্তা ফ্রেমওয়ার্ক দ্বারা উত্পন্ন হয়। আমি এই প্রশ্নটি লিখেছি

public IQueryable<Product> GetProducts(int categoryID)
{
    return from p in db.Products
           where p.CategoryID== categoryID
           select new Product { Name = p.Name};
}

নীচের কোডটি নিম্নলিখিত ত্রুটিটি ছুড়ে ফেলেছে:

"সত্তা বা জটিল ধরণের দোকান।

var products = productRepository.GetProducts(1).Tolist();

তবে আমি যখন এর select pপরিবর্তে ব্যবহার করি তখন select new Product { Name = p.Name};সঠিকভাবে কাজ করে।

আমি কীভাবে একটি পছন্দসই নির্বাচন বিভাগ প্রিফর্ম করতে পারি?


সিস্টেম.নাটসপোর্টার্ড এক্সপ্লেশন: 'সত্তা বা জটিল ধরণের' স্টুডেন্ট ইনফোজএজ্যাক্স.মোডেলস স্টুডেন্ট 'একটি লিনকি টু সত্তা ক্যোয়ারিতে তৈরি করা যায় না' '
মোঃ ওয়াহিদ

উত্তর:


390

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

public class ProductDTO
{
    public string Name { get; set; }
    // Other field you may need from the Product entity
}

এবং আপনার পদ্ধতিটি ডিটিওর একটি তালিকা ফিরিয়ে দেবে।

public List<ProductDTO> GetProducts(int categoryID)
{
    return (from p in db.Products
            where p.CategoryID == categoryID
            select new ProductDTO { Name = p.Name }).ToList();
}

152
আমি বুঝতে পারি না কেন আমি এটি করতে সক্ষম হবো না ... এটি খুব উপকারী হবে ...
জোনক্স

118
ওয়েল, EF- এ ম্যাপযুক্ত সত্তা মূলত ডাটাবেস সারণি উপস্থাপন করে। আপনি যদি একটি ম্যাপ সত্তা সম্মুখের প্রকল্প থাকে, তাহলে আপনি মূলত কি কি আংশিকভাবে কোনো সত্তার, যা একটি বৈধ রাজ্যের নয় লোড করুন। EF- র কী কীভাবে ভবিষ্যতে এই জাতীয় সত্তার আপডেট হ্যান্ডেল করতে হবে তার কোনও ক্লু নেই (ডিফল্ট আচরণটি সম্ভবত নালগুলি সহ লোডযুক্ত ক্ষেত্রগুলিকে ওভাররাইট করা হবে বা আপনার বস্তুতে যা কিছু থাকবে)। এটি একটি বিপজ্জনক অপারেশন হতে পারে, যেহেতু আপনি আপনার কিছু তথ্য ডিবি-তে হারিয়ে যাওয়ার ঝুঁকিপূর্ণ হবেন, সুতরাং এটিতে আংশিকভাবে সত্ত্বা (বা ম্যাপযুক্ত সংস্থাগুলি) ইএফ-তে লোড করার অনুমতি নেই।
ইয়াকিমিচ

26
@ ইয়াকিমিচ আপনাকে বোঝায় যে ব্যতীত যদি আপনার কাছে এমন কিছু সামগ্রিক সত্তা থাকে যা আপনি কোনও ক্যোয়ারির মাধ্যমে তৈরি / তৈরি করছেন এবং তাই পুরোপুরি সচেতন / একটি ব্র্যান্ড নতুন সত্তা তৈরির উদ্দেশ্যে আছেন যা আপনি পরে সামাল দেবেন এবং পরে যুক্ত করবেন। এক্ষেত্রে আপনাকে হয় জিজ্ঞাসাটি জোর করে চালাতে হবে বা একটি ডিটিওতে চাপতে হবে এবং যুক্ত করতে কোনও সত্তায় ফিরে যেতে হবে - যা হতাশাব্যঞ্জক
Cargowire

16
@ কার্গোভায়ার - আমি একমত, যে দৃশ্যটি বিদ্যমান এবং এটি হতাশার কারণ যখন আপনি জানেন যে আপনি কী করছেন তবে সীমাবদ্ধতার কারণে এটি করার অনুমতি দেওয়া হচ্ছে না। যাইহোক, যদি এটি অনুমোদিত হয়ে থাকে তবে হতাশ বিকাশকারীরা প্রচুর হতাশ বিকাশকারীদের তাদের ডেটা নষ্ট হওয়ার বিষয়ে অভিযোগ করবেন যখন উদাহরণস্বরূপ আংশিক লোড হওয়া সত্তাগুলি সংরক্ষণ করার চেষ্টা করছেন। আইএমও, এমন একটি ত্রুটি যা প্রচুর শব্দে প্রবাহিত হয় (একটি ব্যতিক্রম ইত্যাদি ছুঁড়ে ফেলা) আচরণের চেয়ে ভাল যা লুকানো বাগগুলি সনাক্ত করতে এবং ব্যাখ্যা করতে অসুবিধা সৃষ্টি করতে পারে (আপনার গায়ে থাকা ডেটাগুলি লক্ষ্য করা শুরু করার আগে জিনিসগুলি ভাল কাজ করে)।
ইয়াকিমিচ


275

আপনি বেনামে টাইপ করতে পারেন, এবং তারপরে এটি থেকে মডেল প্রকারে

public IEnumerable<Product> GetProducts(int categoryID)
{
    return (from p in Context.Set<Product>()
            where p.CategoryID == categoryID
            select new { Name = p.Name }).ToList()
           .Select(x => new Product { Name = x.Name });
}

সম্পাদনা : এই প্রশ্নটি যেহেতু যথেষ্ট মনোযোগ পেয়েছে আমি তখন থেকে আরও নির্দিষ্ট হতে চলেছি।

আপনি সরাসরি মডেল প্রকারে (EF বিধিনিষেধ) প্রজেক্ট করতে পারবেন না, সুতরাং এর আশেপাশে কোনও উপায় নেই। একমাত্র উপায় হ'ল বেনামে টাইপ করা (1 ম পুনরুক্তি), এবং তারপরে মডেল প্রকারে (2 য় পুনরাবৃত্তি)।

দয়া করে এও সচেতন হন যে আপনি যখন আংশিকভাবে সত্তাগুলি এই পদ্ধতিতে লোড করেন তখন সেগুলি আপডেট করা যায় না, তাই তাদের যেমন হয় তেমন আলাদা থাকতে হবে।

কেন এটি সম্ভব নয় তা আমি কখনই পুরোপুরি বুঝতে পারি নি এবং এই থ্রেডের উত্তরগুলি এর বিরুদ্ধে দৃ strong় কারণ দেয় না (বেশিরভাগ আংশিক লোড হওয়া ডেটার কথা বলছে)। এটি সঠিক যে আংশিকভাবে লোড হওয়া রাষ্ট্রের সত্তা আপডেট করা যাবে না, তবে তারপরে, এই সত্তাটি আলাদা করা হবে, সুতরাং তাদের সংরক্ষণের জন্য দুর্ঘটনাজনক প্রচেষ্টা সম্ভব হবে না।

আমি উপরে যে পদ্ধতিটি ব্যবহার করেছি তা বিবেচনা করুন: ফলস্বরূপ আমাদের এখনও একটি আংশিক লোড হওয়া মডেল সত্তা রয়েছে। এই সত্তাটি বিচ্ছিন্ন।

এটি (ইচ্ছা থেকে থাকার) সম্ভাব্য কোডটি বিবেচনা করুন:

return (from p in Context.Set<Product>()
        where p.CategoryID == categoryID
        select new Product { Name = p.Name }).AsNoTracking().ToList();

এটি পৃথক পৃথক সংস্থাগুলির একটি তালিকাতেও ফলস্বরূপ হতে পারে, সুতরাং আমাদের দুটি পুনরাবৃত্তি করার প্রয়োজন হবে না। একটি সংকলক স্মার্ট হবে যে AsNoTracking () ব্যবহার করা হয়েছে, যার ফলে পৃথক পৃথক সংস্থাগুলি তৈরি হবে, সুতরাং এটি আমাদের এটি করার অনুমতি দিতে পারে। তবে, যদি আসনো ট্র্যাকিং () বাদ দেওয়া হয় তবে এটি এখন যেভাবে ছুঁড়েছে একই ব্যতিক্রমটি ছুঁড়ে ফেলতে পারে, আমাদের সতর্ক করতে যে আমরা যে ফলাফলটি চাই তা সম্পর্কে আমাদের যথেষ্ট সুনির্দিষ্ট হওয়া দরকার।


3
আপনি যখন নির্বাচিত সত্তাটি প্রকল্প করতে চান তার অবস্থা সম্পর্কে যখন আপনার প্রয়োজন হয় না বা প্রয়োজন হয় না তখন এটিই সবচেয়ে পরিষ্কার সমাধান।
মারিও মায়ারেলিস

2
এবং যখন আপনি আইএনউমারেবল বা আইকিউয়েরেবল ফিরিয়ে দেন তবে আপনি যত্ন করবেন না;)। তবে তবুও আপনি আমার আপভোট পান কারণ এই সমাধানটি এখন আমার পক্ষে কাজ করে।
মাইকেল ব্রেন্ট

10
প্রযুক্তিগতভাবে, মডেলের ধরণের প্রজেকশনটি ক্যোয়ারির বাইরে দেখা দেয় এবং আমি বিশ্বাস করি যে তালিকার মাধ্যমে আরও একটি পুনরাবৃত্তি প্রয়োজন। আমি এই কোডটি আমার কোডের জন্য ব্যবহার করব না, তবে এটি প্রশ্নের সমাধান। uptick।
1c1 চক্র

4
আমি এটি গ্রহণযোগ্য ডিটিও সমাধানের চেয়ে বেশি পছন্দ করি - আরও মার্জিত এবং পরিষ্কার
অ্যাডাম হে

7
শ্রদ্ধার সাথে তা বাদে এটি আসলে প্রশ্নের উত্তর নয়। এটি লিনাক টু অবজেক্টস প্রজেকশনটি কীভাবে করা যায় তার একটি উত্তর, লিনাক টু সত্তা প্রতিষ্ঠানগুলির ক্যোয়ারী প্রজেকশন নয়। সুতরাং ডিটিও বিকল্পটি একমাত্র বিকল্প পুনরায়: লিনাক টু সত্তা।
রিজম

78

আমি কাজগুলি পেয়েছি এমন আরও একটি উপায় রয়েছে, আপনাকে এমন একটি শ্রেণি তৈরি করতে হবে যা আপনার পণ্য শ্রেণীর থেকে প্রাপ্ত এবং এটি ব্যবহার করতে হবে। এই ক্ষেত্রে:

public class PseudoProduct : Product { }

public IQueryable<Product> GetProducts(int categoryID)
{
    return from p in db.Products
           where p.CategoryID== categoryID
           select new PseudoProduct() { Name = p.Name};
}

এটি "অনুমোদিত" কিনা তা নিশ্চিত নন তবে এটি কাজ করে।


3
চতুর! এটি এখন চেষ্টা করেছেন এবং এটি কাজ করে। আমি নিশ্চিত যদিও এটি আমাকে একরকম পোড়াবে।
ড্যানিয়েল

5
বিটিডাব্লু এটি আপনাকে দংশিত করে যদি আপনি গেটপ্রোডাক্টস () এর ফলাফল অবিরত রাখতে চেষ্টা করেন যেহেতু ইএফ সিউডো প্রোডাক্টের ম্যাপিং যেমন: "সিস্টেম.অনুষ্ঠানিক অপসারণ: ম্যাপিং এবং মেটাডেটা তথ্য সন্ধান করতে পারেনি এন্টিটাইপ টাইপ 'ব্লাও.সুডোপ্রডাক্ট'" পাওয়া যায়নি।
স্মিং করুন

4
সেরা উত্তর, এবং প্রশ্নের উত্তরগুলির মধ্যে একমাত্র উত্তর। অন্যান্য সমস্ত উত্তরগুলি রিটার্নের ধরণ পরিবর্তন করে বা অকালপূর্বে আইকোয়ারিযোগ্যকে কার্যকর করে এবং বস্তুকে লিনাক ব্যবহার করে
rdans

2
এটি কাজ করে 100% হতবাক করেছে ... EF 6.1 এ এটি কাজ করছে।
ট্র্যাভিসওয়াইডেড

2
@ মজব্লগগুলি উদ্ভূত শ্রেণিতে [নটম্যাপড] বৈশিষ্ট্য চেষ্টা করুন বা .আপনি সাবলীল এপিআই ব্যবহার করছেন তবে <T> উপেক্ষা করুন।
ডানক

37

অ্যাডিশনাল ক্লাস ঘোষণা না করে এটি করার একটি উপায় এখানে:

public List<Product> GetProducts(int categoryID)
{
    var query = from p in db.Products
            where p.CategoryID == categoryID
            select new { Name = p.Name };
    var products = query.ToList().Select(r => new Product
    {
        Name = r.Name;
    }).ToList();

    return products;
}

তবে আপনি কেবলমাত্র একক সত্তায় একাধিক সত্তাকে একত্রিত করতে চাইলে এটি কেবলমাত্র ব্যবহৃত হবে। উপরের কার্যকারিতা (পণ্য থেকে ম্যাপিংয়ের সহজ পণ্য) এইভাবে করা হয়:

public List<Product> GetProducts(int categoryID)
{
    var query = from p in db.Products
            where p.CategoryID == categoryID
            select p;
    var products = query.ToList();

    return products;
}

23

আর একটি সহজ উপায় :)

public IQueryable<Product> GetProducts(int categoryID)
{
    var productList = db.Products
        .Where(p => p.CategoryID == categoryID)
        .Select(item => 
            new Product
            {
                Name = item.Name
            })
        .ToList()
        .AsQueryable(); // actually it's not useful after "ToList()" :D

    return productList;
}

ভাল কথা আমি আপনার সুন্দর জবাব দিয়ে আইকুয়্যারেবল কিছু শিখেছি। এটি যদি আপনার টোললিস্টের পরে কেন কার্যকর হয় না তবে এটি ব্যাখ্যা করতেন (কারণ) আপনি যদি লিনিক-টু এসকিউএল কোয়েরিতে জেনেরিক তালিকা ব্যবহার করতে না পারেন তবে এটি দুর্দান্ত হত। সুতরাং যদি আপনি জানেন যে আপনি সবসময় ফলাফলকে কলারের দ্বারা অন্য কোনও ক্যোয়ারিতে ঠেলাঠেলি করেন তবে অবশ্যই আইকুয়েরেবল হতে হবে sense তবে যদি না হয় ... আপনি যদি এটি জেনেরিক তালিকার পরে ব্যবহার করতে চান তবে পদ্ধতির অভ্যন্তরে টোলিস্ট () ব্যবহার করুন যাতে আপনি এই পদ্ধতিতে প্রতিটি আইকোয়ারিযোগ্যতে টোললিস্ট () না করেন।
PositiveGuy

আপনি আমার বন্ধুকে পুরোপুরি ঠিক করে দিয়েছেন I আমি কেবল প্রশ্ন পদ্ধতির স্বাক্ষরটি অনুকরণ করি, এ কারণেই আমি এটিকে একটি ক্যোরি-সক্ষমে রূপান্তর করি ...;)
সোরেন

1
এটি কাজ করে, পণ্য তালিকাটি টোললিস্ট () এর পরে অযোগ্য হয়ে যায়। আমি কীভাবে এটি সম্পাদনযোগ্য করে তুলতে পারি?
ডোনকডাভোনা

আপনি যদি .ToListজিজ্ঞাসা করে রাখেন , এটি কার্যকর করা হয় এবং সার্ভার থেকে ডেটা টানা হয় তবে এটি আবার তৈরি করার কী দরকার AsQueryable??
মোশি 23

1
@ মোশিই কেবল পদ্ধতিটি ফেরতের ধরণের স্বাক্ষর পূরণ করার জন্য (আমি উত্তরে বলেছি, এটি আর কার্যকর নয়)।
সোরেন

4

আপনি এটি ব্যবহার করতে পারেন এবং এটি কাজ করা উচিত -> toListনির্বাচন করে নতুন তালিকা তৈরি করার আগে আপনাকে অবশ্যই ব্যবহার করতে হবে:

db.Products
    .where(x=>x.CategoryID == categoryID).ToList()
    .select(x=>new Product { Name = p.Name}).ToList(); 

3
এটি এখনও 'নির্বাচন থেকে [নির্বাচন করুন [..]' করবে, 'নির্বাচন থেকে নাম নির্বাচন করো না [..]'
টিমো হারম্যানস

1

অনুলিপি হিসাবে চিহ্নিত অন্যান্য প্রশ্নের জবাবে ( এখানে দেখুন ) আমি সোরেনের উত্তরের ভিত্তিতে একটি দ্রুত এবং সহজ সমাধান বের করেছি:

data.Tasks.AddRange(
    data.Task.AsEnumerable().Select(t => new Task{
        creator_id   = t.ID,
        start_date   = t.Incident.DateOpened,
        end_date     = t.Incident.DateCLosed,
        product_code = t.Incident.ProductCode
        // so on...
    })
);
data.SaveChanges();

দ্রষ্টব্য: এই সমাধানটি কেবল তখনই কাজ করে যদি আপনার কাছে টাস্ক ক্লাসে নেভিগেশন সম্পত্তি (বিদেশী কী) থাকে (এখানে 'ঘটনা' বলা হয়)। আপনার যদি তা না থাকে তবে আপনি কেবলমাত্র "এসকিউয়েরেবল ()" দিয়ে পোস্ট করা অন্যান্য সমাধানগুলির মধ্যে একটি ব্যবহার করতে পারেন।


1

আপনি ডেটা ট্রান্সফার অবজেক্টস (ডিটিও) ব্যবহার করে এটি সমাধান করতে পারেন।

এগুলি কিছুটা ভিউ মডেলগুলির মতো যেখানে আপনি প্রয়োজনীয় বৈশিষ্ট্যগুলি রেখেছেন এবং এগুলি আপনার নিয়ামকটিতে বা অটোম্যাপারের মতো তৃতীয় পক্ষের সমাধানগুলি ব্যবহার করে ম্যানুয়ালি ম্যাপ করতে পারেন।

ডিটিওর সাহায্যে আপনি এটি করতে পারেন:

  • ডেটা সিরিয়ালযোগ্য করুন (জসন)
  • বিজ্ঞপ্তি সংক্রান্ত রেফারেন্সগুলি থেকে মুক্তি পান
  • আপনার প্রয়োজন নেই এমন বৈশিষ্ট্য রেখে নেটওয়ার্কট্রাফিক্য হ্রাস করুন (ভিউ মডেলওয়াইজ)
  • অবজেক্ট ফ্ল্যাটিং ব্যবহার করুন

আমি এই বছর স্কুলে এটি শিখছি এবং এটি একটি খুব দরকারী সরঞ্জাম।


0

আপনি যদি সত্ত্বার কাঠামো ব্যবহার করছেন, তবে ডাবিকনটেক্সট থেকে সম্পত্তিটি সরিয়ে দেওয়ার চেষ্টা করুন যা আপনার জটিল মডেলটিকে সত্তা হিসাবে ব্যবহার করে যা সত্তা নামক একটি ভিউমডেলে একাধিক মডেলকে ম্যাপ করার সময় আমার একই সমস্যা হয়েছিল

public DbSet<Entity> Entities { get; set; }

DbContext থেকে এন্ট্রি সরিয়ে আমার ত্রুটি স্থির করে।


0

যদি আপনি নির্বাহ করছে Linq to Entityআপনি ব্যবহার করতে পারবেন না ClassTypeসঙ্গে newমধ্যে selectক্যোয়ারী অবসানonly anonymous types are allowed (new without type)

আমার প্রকল্পের এই স্নিপেটটি দেখুন

//...
var dbQuery = context.Set<Letter>()
                .Include(letter => letter.LetterStatus)
                .Select(l => new {Title =l.Title,ID = l.ID, LastModificationDate = l.LastModificationDate, DateCreated = l.DateCreated,LetterStatus = new {ID = l.LetterStatusID.Value,NameInArabic = l.LetterStatus.NameInArabic,NameInEnglish = l.LetterStatus.NameInEnglish} })
                               ^^ without type__________________________________________________________________________________________________________^^ without type

new keywordএমনকি আপনি নির্বাচিত ক্লোজারে যোগ করেছেন এমনকি complex propertiesআপনি এই ত্রুটিটি পেয়ে যাবেন

তাই উপর শব্দ প্রশ্নের ,,removeClassTypes from newLinq to Entity

কারণ এটি স্কেল স্টেটমেন্টে রূপান্তরিত হবে এবং স্কেল সার্ভারে কার্যকর করা হবে

তাই যখন আমি ব্যবহার করতে পারেন new with typesউপর selectঅবসান?

আপনি যদি এটি ব্যবহার করছেন তবে আপনি এটি ব্যবহার করতে পারেন LINQ to Object (in memory collection)

//opecations in tempList , LINQ to Entities; so we can not use class types in select only anonymous types are allowed
var tempList = dbQuery.Skip(10).Take(10).ToList();// this is list of <anonymous type> so we have to convert it so list of <letter>

//opecations in list , LINQ to Object; so we can use class types in select
list = tempList.Select(l => new Letter{ Title = l.Title, ID = l.ID, LastModificationDate = l.LastModificationDate, DateCreated = l.DateCreated, LetterStatus = new LetterStatus{ ID = l.LetterStatus.ID, NameInArabic = l.LetterStatus.NameInArabic, NameInEnglish = l.LetterStatus.NameInEnglish } }).ToList();
                                ^^^^^^ with type 

আমি ToListক্যোয়ারিতে মৃত্যুদন্ড কার্যকর করার পরে এটি হয়ে গেল in memory collection যাতে আমরা new ClassTypesনির্বাচনতে ব্যবহার করতে পারি


নিশ্চিত যে আপনি বেনাম প্রকারগুলি ব্যবহার করতে পারেন তবে আপনি লিনকিউ ক্যোয়ারিতে কোনও সত্ত্বা তৈরি করতে পারবেন না, এমনকি কোনও বেনাম সদস্য নির্ধারণ করতে পারবেন না, কারণ লিনকু-টু-প্রতিষ্ঠান এখনও একই ব্যতিক্রম ছুঁড়ে ফেলেছে।
সানক্যাট 2000

0

অনেক ক্ষেত্রে রূপান্তরের প্রয়োজন হয় না। আপনি যে কারণে দৃ List়ভাবে তালিকা চান তার কারণটি ভেবে দেখুন এবং মূল্যায়ন করুন যদি আপনি কেবল ডেটা চান, উদাহরণস্বরূপ, কোনও ওয়েব পরিষেবাতে বা এটি প্রদর্শনের জন্য। এটা টাইপ কোন ব্যাপার না। আপনাকে কেবল এটি পড়তে হবে এবং আপনার নির্ধারিত বেনামে সংজ্ঞায়িত বৈশিষ্ট্যের সাথে মিল রয়েছে তা যাচাই করতে হবে। এটিই অনুকূল পরিস্থিতি, এমন কোনও কারণ তৈরি করুন যার জন্য আপনাকে কোনও সত্তার সমস্ত ক্ষেত্রের প্রয়োজন হবে না এবং এ কারণেই বেনামে প্রকারের উপস্থিতি রয়েছে।

একটি সহজ উপায় এটি করছে:

IEnumerable<object> list = dataContext.Table.Select(e => new { MyRequiredField = e.MyRequiredField}).AsEnumerable();

0

আপনি সন্ধান করছেন এটি আপনার সারণী হওয়ায় এটি আপনাকে পণ্যটিতে আবার ম্যাপ করতে দেয় না। আপনার একটি বেনামি ফাংশন প্রয়োজন, তারপরে আপনি এটিকে একটি ভিউমডেলে যুক্ত করতে পারেন এবং প্রতিটি ভিউমোডেলকে একটিতে যুক্ত করতে List<MyViewModel>পারেন এবং এগুলি ফিরিয়ে দিতে পারেন। এটি একটি সামান্য ডিগ্রেশন, তবে আমি নালাগুলি তারিখগুলি পরিচালনা করার বিষয়ে সতর্কতাগুলিকে অন্তর্ভুক্ত করছি কারণ এটির পিছনে ব্যথা হ'ল কেবল আপনার যদি কিছু থাকে তবে। এইভাবেই আমি এটি পরিচালনা করেছি।

আশা করি আপনার একটি আছে ProductViewModel:

public class ProductViewModel
{
    [Key]
    public string ID { get; set; }
    public string Name { get; set; }
}

আমার নির্ভরতা ইনজেকশন / সংগ্রহস্থল কাঠামো রয়েছে যেখানে আমি আমার ডেটা ধরার জন্য একটি ফাংশন বলি। আপনার পোস্টটিকে উদাহরণস্বরূপ ব্যবহার করে, আপনার কন্ট্রোলার ফাংশন কলে, এটি দেখতে দেখতে এমন হবে:

int categoryID = 1;
var prods = repository.GetProducts(categoryID);

ভান্ডার শ্রেণিতে:

public IEnumerable<ProductViewModel> GetProducts(int categoryID)
{
   List<ProductViewModel> lstPVM = new List<ProductViewModel>();

   var anonymousObjResult = from p in db.Products
                            where p.CategoryID == categoryID 
                            select new
                            {
                                CatID = p.CategoryID,
                                Name = p.Name
                            };

        // NOTE: If you have any dates that are nullable and null, you'll need to
        // take care of that:  ClosedDate = (DateTime?)p.ClosedDate ?? DateTime.Now

        // If you want a particular date, you have to define a DateTime variable,
        // assign your value to it, then replace DateTime.Now with that variable. You
        // cannot call a DateTime.Parse there, unfortunately. 
        // Using 
        //    new Date("1","1","1800"); 
        // works, though. (I add a particular date so I can edit it out later.)

        // I do this foreach below so I can return a List<ProductViewModel>. 
        // You could do: return anonymousObjResult.ToList(); here
        // but it's not as clean and is an anonymous type instead of defined
        // by a ViewModel where you can control the individual field types

        foreach (var a in anonymousObjResult)
        {                
            ProductViewModel pvm = new ProductViewModel();
            pvm.ID = a.CatID;  
            pvm.Name = a.Name;
            lstPVM.Add(rvm);
        }

        // Obviously you will just have ONE item there, but I built it 
        // like this so you could bring back the whole table, if you wanted
        // to remove your Where clause, above.

        return lstPVM;
    }

নিয়ামক ফিরে, আপনি কি:

 List<ProductViewModel> lstProd = new List<ProductViewModel>();

 if (prods != null) 
 {
    // For setting the dates back to nulls, I'm looking for this value:
    // DateTime stdDate = DateTime.Parse("01/01/1800");

    foreach (var a in prods)
    {
        ProductViewModel o_prod = new ReportViewModel();
        o_prod.ID = a.ID;
        o_prod.Name = a.Name;
       // o_prod.ClosedDate = a.ClosedDate == stdDate ? null : a.ClosedDate;
        lstProd.Add(o_prod);
    }
}
return View(lstProd);  // use this in your View as:   @model IEnumerable<ProductViewModel>

-1

কেবলমাত্র আসনযোগ্য () যুক্ত করুন:

public IQueryable<Product> GetProducts(int categoryID)
{
    return from p in db.Products.AsEnumerable()
           where p.CategoryID== categoryID
           select new Product { Name = p.Name};
}

8
কখনই না! এটি ডিবি থেকে সমস্ত ডেটা আনবে এবং তারপরে নির্বাচনটি করবে।
Gh61

1
এ কারণেই কিছু সংস্থায় লিনক ব্যবহার নিষিদ্ধ।
হাকান

-2

আপনি নিম্নলিখিত সংগ্রহের মতো আপনার সংগ্রহে অসমাপ্ত যোগ করতে পারেন:

public IQueryable<Product> GetProducts(int categoryID)
{
    return from p in db.Products.AsEnumerable()
           where p.CategoryID== categoryID
           select new Product { Name = p.Name};
}

এটি কাজ করেও কেন এটি একটি খারাপ উত্তর ... .সত্তার জন্য অগণিত সমাপ্তি লিনাক। দ্য ক্লজ এবং অন্যান্য সমস্ত কিছু লিনিকের বাইরে সত্তা থেকে পরিচালিত হয়। অর্থাত্ প্রতিটি পণ্য পুনরুদ্ধার করা হয় তারপরে লিনক দ্বারা বস্তুগুলিতে ফিল্টার করা হয়। এগুলি বাদ দিয়ে এটি উপরের টোললিস্টের উত্তর হিসাবে বেশ প্রায় একই। stackoverflow.com/questions/5311034/...
KenF

1
এটির সাথে সমস্যাটি হ'ল ... থেকে একটি নির্বাচন করুন ... সম্পাদিত, নতুন পণ্য {নাম = পি N নাম select নির্বাচন করবেন না, যেহেতু আপনি একটি চক্রীয় রেফারেন্সও পাবেন। এবং আপনি শুধু নাম চান।
স্টার্লিং ডায়াজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.