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