0

我得到了以下2種型號:獲取隨機對象與實體框架多對多關係6

public class CrawledImage 
{ 
    public CrawledImage() 
    { 
     CrawlDate = DateTime.UtcNow; 
     Status = ImageStatus.Unchecked; 
    } 

    public int ID { get; set; } 
    public DateTime CrawlDate { get; set; } 
    public string FileUrl { get; set; } 
    public long Bytes { get; set; } 
    public ImageStatus Status { get; set; } 
    public string FileName { get; set; } 
    public string Type { get; set; } 
    public virtual ICollection<ImageTag> ImageTags { get; set; } 
} 

public class ImageTag 
{ 
    public ImageTag() 
    { 
    } 

    public int ID { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<CrawledImage> CrawledImages { get; set; } 
} 

現在,我想要的是得到一個隨機CrawledImage,這是不是當前的圖像,並且具有我在一個列表中提供的所有標籤(或集合的HashSet無關緊要)。請注意,這是一個多對多的關係。我試着用下面的代碼,但我失敗了,所以我評論了關於標籤的部分。我更喜歡用Entity Framework來做到這一點。

public static CrawledImage GetRandomImage(int currentid, List<ImageTag> listtags) 
{ 
    try 
    { 
     while (true) 
     { 
      var randomId = new Random().Next(0, DbContext.CrawledImages.Count()); 

      if (!randomId.Equals(currentid)) 
      { 
       var image = 
        DbContext.CrawledImages.Single(i => i.ID.Equals(randomId)); 
        //DbContext.CrawledImages.Where(i => i.ImageTags.Any(tag => listtags.Contains(tag))).First(); 
       if (ProcessImage(image)) 
        return image; 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     // Failed so return image with id -1 
     return new CrawledImage {ID = -1}; 
    } 
} 

謝謝!

編輯: 我的問題被標記爲重複。它只涉及檢索隨機記錄的問題。我得到了這個工作。它更多地是關於多對多的關係。下面有一個答案,但這給了我錯誤:

在EntityFramework.SqlServer.dll中發生類型'System.NotSupportedException'的異常,但未在用戶代碼中處理其他信息:無法創建常量值類型'ChickSpider.Logic.Models.ImageTag'。只有原始類型或枚舉類型在此上下文中受支持。

編輯2:

與鞋的答案幫助我理解了它。下面是代碼

public static CrawledImage GetRandomImage(int currentid = 0, HashSet<string> tags = null) 
{ 
    if (tags == null) 
     return DbContext.CrawledImages.Where(c => c.ID != currentid).OrderBy(c => Guid.NewGuid()).First(); 

    // ImageTags should match any given tags 
    return DbContext.CrawledImages.Where(c => c.ID != currentid && c.ImageTags.Any(ci => tags.Any(lt => lt == ci.Name))).OrderBy(c => Guid.NewGuid()).First(); 

    // ImageTags should match all given tags 
    //return DbContext.CrawledImages.Where(c => c.ID != currentid && c.ImageTags.All(ci => tags.Any(lt => lt == ci.Name))).OrderBy(c => Guid.NewGuid()).First(); 
} 

回答

0

你也許可以在更短的代碼來完成這個...

//All crawledImages not equal to current image and contain listtags 
var crawledImages = DbContext.CrawledImages.Where(ci => ci.ID != currentid && 
        ci.ImageTags.All(ci => listtags.Any(lt => lt.ID == ci.ID)); 

var random = new Random(); 
var randImage = crawledImages.OrderBy(ci => random.Next()).FirstOrDefault(); 

在另一方面(也許個人喜好?)我不會從該方法返回假數據。

catch (Exception ex) 
{ 
    //Log exception 
    //.. 
    return null; 
} 
+0

我同意虛擬數據部分。但是我在最後一行發現以下異常: EntityFramework.SqlServer.dll中出現類型爲「System.NotSupportedException」的異常,但未在用戶代碼中處理 其他信息:無法創建類型爲'ChickSpider'的常量值.Logic.Models.ImageTag」。只有原始類型或枚舉類型在此上下文中受支持。 當我試圖在crawledImages中調試時,我看到了相同的異常。我也嘗試刪除這兩個集合上的虛擬,但這也沒有幫助。 – Fortitude 2014-11-20 22:48:38

相關問題