簡體   English   中英

實體框架查詢-如何返回期望的結果

[英]Entity Framework Query - how to return desired results

我有這個查詢

ViewBag.Tags = db.Tag_Group
   .Where(u => 
      u.Tags.Any(d => d.CategoryName.Contains("|" + CategoryID + "|")) 
      & u.Tags.Any(s=>s.Tag_List.Any(d=>d.Item.ItemsOnStock>0)))
   .OrderBy(y => y.TagGrupName)
   .ToList();

它返回所有組,而不僅是ItemsOnStock>0組。

我究竟做錯了什么 ?

Tag_List有很多Item和很多Tags Tag_Group有很多Tags

Tag_List用於存儲特定Items Tags

我只需要List<Tag_Group>庫存。 有更好的方法嗎?

這是一個偽裝的“已過濾的包含”問題,答案與通常的變通方法類似,因為在Include缺少過濾

在您的情況下,最好在Tags處啟動查詢,並按其TagGroup對其進行TagGroup (我認為其中存在Navigation屬性):

db.Tags
  .Where(t => t.CategoryName.Contains("|" + CategoryID + "|") 
           && t.Tag_List.Any(d => d.Item.ItemsOnStock > 0))
  .GroupBy(t => t.TagGroup)
  .AsEnumerable()
  .Select(g => g.Key)
  .OrderBy(y => y.TagGroupName)
  .ToList();

請記住要禁用延遲加載,因此在訪問它們時將不會完全填充組的“ Tags集合。

可能是因為您的&而不是&&導致了錯誤的結果?

因此,您有一個Tag_Group類。 Tag_Group每個對象都有零個或多個Tags

每個Tag都有一個字符串CategoryName和一個IEnumerable Tag_List ,該列表包含零個或多個Items 每個Item都有一個int(?)屬性ItemOnStock int部分並不重要。 它可以是任何類,只要您可以將其與零進行比較即可。

似乎您希望所有Tag_Group對象在其Tags序列中至少具有一個Tag ,這些Tags應:

  • CategoryName等於“ |” + CategoryID +“ |”
  • ANDTag_List中至少有一個ItemOnStock > 0

或者是您想要所有Tag_Group對象

  • 至少有一個TagTagsCategoryName等於“|” + CategoryID +“ |”
  • 至少有一個TagTags ,在具有監聽中心一個項目Tag_List有一個ItemOnStock > 0 Tag可能與帶有CategoryName Tag不同

我假設您想要AND選項。

盡管您沒有這么說,但我假設db是您的dbContext,並且您希望查詢由數據庫執行,因此為AsQueryable,而不是AsEnumerable。

var CategoryId = ...
string categoryName = "|" + CategoryId + "|";

var result = db.Tag_Group
   // I want only those tagGroupElements that have at least one Tag
   // in sequence Tags that matches both conditions:
   .Where(tagGroupElement => tagGroupEleent.Tags
             // the tagGroupElement should have a matching CategoryName
       .Where(tag => tag.CategoryName == categoryName)
             // and the tagGroupElement should have at least one item
             // in Tag_List with ItemOnStock > 0
          && tag.Tag_List
              .Where(tagListElement => tagListElement.ItemOnStock > 0)
              .Any())
       .Any());

謝謝你們的幫助:)

我最終使用了經過修改的Gert答案,因為我需要按TagGroup分組的標簽

db.Tags
  .Where(t => t.CategoryName.Contains("|" + CategoryID + "|") 
           && t.Tag_List.Any(d => d.Item.ItemsOnStock > 0))
  .GroupBy(t => t.TagGroup.GroupName)
  .OrderBy(y => y.Key)
  .ToList();

我從你的答案中學到了很多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM