2012-08-23 45 views
0

我想獲得一個Where In子句與linq一起工作並遇到問題。我的問題是我有幾個實體的列表,我想從這些列表中選擇一組遊戲實體,基本上爲它們設置了一個SQL WHERE IN子句。問題在於實體列表正在與具有多對多關係的遊戲實體的相關實體進行比較。我已經做了大量的研究,並嘗試了一堆解決方案來解決這個問題,但不能完全正確,我真的很感謝來自於stackoverflow社區的一些幫助。Linq到實體在哪裏在子句多對多

在此先感謝。

編輯:

我已經試過這樣做,而不是工會:

 var relatedGames = from game in ugdb.Games 
         where game.Developers.Any(d => relatedDevelopers.Any(r => r.DeveloperID == d.DeveloperID)) 
         || game.Publishers.Any(d => relatedPublishers.Any(r => r.PublisherID == d.PublisherID)) 
         || game.Genres.Any(d => relatedGenres.Any(r => r.GenreID == d.GenreID)) 
         select game; 

同時與工會和這個我收到以下錯誤信息:

基地{} System.SystemException = {「無法創建類型爲'UltimateGameDB.Domain.Entities.Developer'的常量值。在此上下文中僅支持基本類型(如Int32,String和Guid)。」}

沒有人有任何想法如何去這樣做沒有

我當前的代碼:

public IQueryable<Video> GetSimilarVideos(Guid videoId) 
    { 
    IQueryable<Video> result = null; 
    List<Video> similarVideoList = null; 

    Video currentVideo = ugdb.Videos.Find(videoId); 

    List<Genre> relatedGenres = new List<Genre>(); 
    List<Developer> relatedDevelopers = new List<Developer>(); 
    List<Publisher> relatedPublishers = new List<Publisher>(); 

    foreach (var game in currentVideo.Games) 
    { 
     relatedDevelopers.AddRange(game.Developers); 
     relatedPublishers.AddRange(game.Publishers); 
     relatedGenres.AddRange(game.Genres); 
    } 

    relatedDevelopers = relatedDevelopers.Distinct().ToList<Developer>(); 
    relatedPublishers = relatedPublishers.Distinct().ToList<Publisher>(); 
    relatedGenres = relatedGenres.Distinct().ToList<Genre>(); 

    //This is the piece I am having trouble with! 
    var relatedGames = from game in ugdb.Games 
         where game.Developers.Union(relatedDevelopers).Count() > 0 
          || game.Genres.Union(relatedGenres).Count() > 0 
          || game.Publishers.Union(relatedPublishers).Count() > 0 
         select game; 

    foreach (var game in relatedGames) 
    { 
     similarVideoList.AddRange(game.Videos.Where(v => v.VideoType.Equals(currentVideo.VideoType))); 
    } 

    result = similarVideoList.Distinct().AsQueryable<Video>(); 

    return result; 
    } 
+0

什麼是你的業務規則?爲什麼你需要使用'Union'? –

+0

我不需要使用聯盟,我只需要能夠獲得具有位於relatedDevelopers,relatedPublishers或relatedGenres列表之一中的開發人員,發佈者或流派的所有遊戲。 –

回答

3

您無法傳遞本地實體 - 它們不會轉換爲sql,在您的案例relatedDevelopers中。 Linq to Entities沒有辦法將relatedDevelopers.Contains轉換爲SQL IN

您可以投射遊戲列表並在內存中進行調用,以便不必將其轉換爲sql - 這很容易,但是如果數據庫很大,則可能會加載全部內容在ugdb.Games

var relatedGames = from game in ugdb.Games.ToList() 
        where game.Developers.Any(d => relatedDevelopers.Any(r => r.DeveloperID == d.DeveloperID)) 
        || game.Publishers.Any(d => relatedPublishers.Any(r => r.PublisherID == d.PublisherID)) 
        || game.Genres.Any(d => relatedGenres.Any(r => r.GenreID == d.GenreID)) 
        select game; 

或者末尾添加ToList(),您可以創建編號的列表和傳遞,因爲這是一個基本類型是SQL可以識別:

 var relatedDevelopers = currentVideo.Games.SelectMany(g => g.Developers).Select(g => g.DeveloperID).ToArray(); 
    var relatedPublishers = currentVideo.Games.SelectMany(g => g.Developers).Select(g => g.DeveloperID).ToArray(); 
    var relatedGenres = currentVideo.Games.SelectMany(g => g.Developers).Select(g => g.DeveloperID).ToArray(); 


    //This is the piece I am having trouble with! 
    var relatedGames = from game in ugdb.Games 
         where game.Developers.Any(d => relatedDevelopers.Contains(d.DeveloperID)) 
         || game.Publishers.Any(d => relatedPublishers.Contains(d.PublisherID)) 
         || game.Genres.Any(d => relatedGenres.Contains(d.GenreID)) 
         select game; 
+0

哇!非常感謝我在這個問題上陷入太久。 –

2

模式通常使用嵌套Any,或AnyContains

var relatedDeveloperIds = relatedDevelopers.Select(r => r.Id).ToList(); 
game.Developers.Any(d => relatedDeveloperIds.Contains(d.Id)) 
+0

感謝您的答覆,我今晚會嘗試這個。 –

+0

嘗試此解決方案時,我收到以下錯誤:base {System.SystemException} = {「無法創建類型'UltimateGameDB.Domain.Entities.Developer'的常量值只有基本類型(如Int32,String和Guid')在這種情況下得到支持。「}任何想法如何做到這一點將無法得到這個錯誤? –

+0

它實際上和我在使用Union語句時得到的錯誤一樣。 –