2015-10-28 19 views
0

我有一個模型類標題-ID:從列出的清單中獲取數據的LINQ

public Word 
{ 
    [key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid WordId {get; set;}; 
    public string WordName {get; set;} 
} 

這句話存儲在

public WordsStorage 
{ 
     public WordsStorage() 
     { 
      CandWords = new HashSet<Word>(); 
     } 

     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public Guid CandWordsModelID { get; set; } 

     public virtual ICollection<Word> CandWords { get; set; } 
} 

當我打電話

var aaa = db.UserCWords.AsEnumerable().Select(e => e.CandWords).Distinct(); 
var listOfLists = aaa.ToList(); 

我收到這個詞的清單 - 這是正確的。

var aaa = db.UserCWords.AsEnumerable().Select(e => e.CandWordsModelID).Distinct(); 
    var listOfLists = aaa.ToList(); 

的ID - 這是工作也沒關係

,但如果我有我的自定義字

Word myCustomWord = new Word(); 
myCustomWord.Id = Guid.NewGuid(); 
myCustomWord.WordName = "BadGuy"; 

如何讓所有CandWordsModelID,在包含這個詞的價值? 我曾嘗試:

db.UserCWords.AsEnumerable().Where(e=>e.CandWords.Where(s=>s.WordName.Contains(myCustomWord.WordName))).Select(e => e.CandWordsModelID).Distinct() 

但得到一個錯誤error CS0029: Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<prj.Models.Word>' to 'bool'

+2

@Luiso,你沒有提供任何問題的鏈接 –

+0

所以你想獲得一個列表的列表,但你想過濾內部列表?你爲什麼使用'Distinct'? –

+0

@YacoubMassad:對不起,這是問題的鏈接http://stackoverflow.com/questions/30494807/linq-query-list-within-another-list – Luiso

回答

0

錯誤被拋出,因爲你基本上在哪裏(...凡(...)...)外凡預計布爾表達式,但內部Where()返回一個IEnumerable。

嘗試更改內部Where()以使用Any()。如果能夠在集合中找到滿足條件的對象,Any()將返回true。

我會好奇你爲什麼需要在db.UserCWords上調用AsEnumerable()。如果UserCWords是IQueryable,那麼在調用AsEnumerable,ToList等之前,您應該調用Where和Select。否則,您將從數據庫中提取整個集合並評估客戶端上的LINQ表達式(而不是將LINQ表達式轉換爲SQL 。)

2

更改此表達式:

e => e.CandWords.Where(s => s.WordName.Contains(myCustomWord.WordName)) 

使用Any代替Where

e => e.CandWords.Any(s => s.WordName.Contains(myCustomWord.WordName)) 

Where將過濾CandWords匹配實體Any將返回CandWords中任何實體的布爾符合您的標準,我相信這是您的目標。

3

試試這個:

var myWord = ... 
db.UserCWords 
    .Where(e => e.CandWords.Any(w => w.WordName.Contains(myWord.WordName))) 
    .Select(e => e.Id) 

沒有必要調用Distinct因爲沒有字店處理兩次。 您的代碼問題似乎是,您正嘗試使用Where的結果進行篩選,該結果返回IEnumerable<T>。現在,如果你看一下Where方法的簽名,你會發現它需要一個IEnumerable<T>和一個謂詞(Func<T, bool>),它返回一個IEnumerable<T>,所以當你調用外部Where它需要一個謂詞,並且因爲你正在使用另一個Where裏面你給它一個Func<T, IEnumerable<T>>而不是Func<T, bool>。你需要使用Any來實現你在做什麼