2011-03-23 10 views
10

यह अब कुछ दिनों के लिए मेरे जीवन को बर्बाद कर दिया गया है, पूछने के लिए समय के लिए ...में और नहीं Linq के साथ की इकाइयां (EF4.0)

मैं इकाई की रूपरेखा 4.0 उपयोग कर रहा हूँ मेरे ऐप के लिए।

एक स्थान (जैसे एक घर या कार्यालय) एक या अधिक सुविधाओं (एक बाथरूम, बेडरूम, स्नूकर टेबल आदि की तरह ..)

मैं स्थान पृष्ठ पर एक चेकबॉक्स सूची प्रदर्शित करना चाहते हैं, एक साथ है सुविधाओं की चेकबॉक्स सूची, जिनके पास वर्तमान में मौजूद स्थान की जांच की गई है।

सुविधाओं के लिए मेरे मॉडल देखें इस प्रकार है ...

public class FacilityViewItem 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public bool Checked { get; set; } 
} 

तो जब im यूआई के स्थान देखें मॉडल गुजर, मैं सुविधाएं जहां टी प्रकार FacilityViewItem की है की एक List<T> पास करना चाहते हैं।

स्थान पहले से मौजूद सुविधाओं को प्राप्त करने के लिए सरल है - मैं स्थान का उपयोग कर एक क्वेरी करता हूं। क्षमताएं जो एंटीटी कोलेक्शन देता है जहां टी प्रकार की सुविधा है। इसका कारण यह है की सुविधाओं में एक नेविगेशन संपत्ति है ....

var facs = from f in location.Facilities 
select new FacilityViewItem() 
{ 
    Id = f.FacilityId, 
    Name = f.Name, 
    Checked = true 
}; 

तो यहाँ जहां मेरी समस्या निहित है - मैं सुविधाओं, लोगों को स्थान नहीं है कि के बाकी चाहता हूँ।

मैंने एक्सेप्ट() और किसी भी() और इसमें शामिल हैं() का उपयोग करने का प्रयास किया है, लेकिन मुझे एक ही त्रुटि मिलती है।

प्रश्नों कि काम नहीं करते के उदाहरण ...

var restOfFacilities = from f in ctx.Facilities 
    where !hasFacilities.Contains(f) 
    select new FacilityViewItem() 
     { 
      Id = f.FacilityId, 
      Name = f.Name 
     }; 

var restOfFacilities = ctx.Facilities.Except(facilitiesThatLocationHas); 

var notFacs = from e in ctx.Facilities 
where !hasFacilities.Any(m => m.FacilityId == e.FacilityId) 
    select new FacilityViewItem() 
     { 
      Id = e.FacilityId, 
      Name = e.Name 
     }; 

और त्रुटि मैं हर कार्यान्वयन के साथ मिलता है ...

System.NotSupportedException एक निरंतर मूल्य बनाने में असमर्थ था बिना क्रिया संदेश = 'Chapter2ConsoleApp.Facility' टाइप करें। इस संदर्भ में केवल आदिम प्रकार (जैसे इंट 32, स्ट्रिंग, और ग्विड ') समर्थित हैं।

मैं यहां क्या देख रहा हूं? विडंबना यह है कि पर्याप्त

var restOfFacilities = from f in ctx.Facilities 
         where !facs.Select(fac => fac.Id).Contains(f.Id) 
         select f; 

उत्तर

19

मैं घंटे के एक मामले में इसे हल करने के बाद मैं यहाँ पर प्रश्न पोस्ट, दुख के दिनों के बाद:

7

पहली क्वेरी ठीक लग रहा है, लेकिन आप Id रों तुलना करने के लिए की जरूरत है।

त्रुटि मूल रूप से कह रही है 'मैं नहीं जानता कि दृढ़ता से टाइप की गई वस्तुओं की तुलना करके कौन सी वस्तुओं को शामिल नहीं किया गया है। मुझे चींटियों या कुछ साधारण प्रकारों की एक सूची दें, और मैं इसका ख्याल रख सकता हूं।

तो, पहले आप प्राथमिक कुंजी की एक सूची प्राप्त करने की आवश्यकता है, तो उस का उपयोग में खंड शामिल हैं ...

//get the primary key ids... 
var hasFacilityIds = from f in hasFacilities 
    select f.FacilityId; 

//now use them in the contains clause... 
var restOfFacilities = from f in ctx.Facilities 
    where !hasFacilityIds.Contains(f.FacilityId) 
     select new FacilityViewItem() 
      { 
       Id = f.FacilityId, 
       Name = f.Name 
      }; 
+0

वास्तव में 3 प्रश्नों मैं पहले से ही करने की कोशिश की के रूप में ही त्रुटि देता है। – Baldy

+0

... हालांकि उस क्वेरी के मेरे मूल उद्धरण में कोई त्रुटि हुई थी! – Baldy

1

मैं देख रहा हूँ hasFacilities, क्या वैसे भी करना चाहते हैं, L2E है, जैसा कि "केवल आदिम इस संदर्भ में प्रकार (जैसे इंट 32, स्ट्रिंग, और ग्विड ') समर्थित हैं ", इसलिए मुझे लगता है कि आपको पहले डेटा पुनर्प्राप्त करना होगा और सुविधाViewItem के संग्रह में डाल देना होगा।

var restOfFacilities = ctx 
    .Facilities 
    .Where(f => !hasFacilities.Contains(f)) 
    .Select(f => new { f.FacilityId, f.Name }) 
    .ToList() 
    .Select(f => new FacilityViewItem { 
     Id = f.FacilityId, 
     Name = f.Name 
    }); 

var notFacs = ctx 
    .Facilities 
    .Where(e => !hasFacilities.Any(m => m.FacilityId == e.FacilityId)) 
    .Select(e => new { e.FacilityId, e.Name }) 
    .ToList() 
    .Select(e => new FacilityViewItem { 
     Id = e.FacilityId, 
     Name = e.Name 
    }); 

आशा है कि यह मदद करता है

संबंधित मुद्दे