[英]Passing list to view using Linq Union results in non-distinct results
使用MVC-4和Entity Framework,我可以從以下查詢構造一個Selectlist
,其行為與預期的聯合一樣。
string x = "Smith"
var a = db.CurrentIndexes.Include(m => m.Files).Where(m => m.Name == x && m.Files.Filename.Length > 4);
var b = db.CurrentIndexes.Include(m => m.Files).Where(m => m.PreviousName == x && m.Files.Filename.Length > 4);
var c = a.Union(b).ToList();
ViewBag.sel = new SelectList(c, string.Empty);
但是,當我嘗試將相同的查詢傳遞給視圖以迭代到列表時,結果不再唯一。 我一直在一個視圖包( ViewBag.d = c.ToList();
)中傳遞查詢ViewBag.d = c.ToList();
我從各個方面( CurrentIndexes
)獲取每個實例。
我已經嘗試過嘗試以各種方式查詢c
並將其作為模型或通過ViewBag
,但是我收到錯誤消息,說我的結果與視圖所需的集合類型不匹配,因此我ViewBag
使用ViewBag
來查看是否我無法獲得所需的獨特結果。
如有任何建議,我將不勝感激
嘗試像這樣使用Distinct()子句:
var c = a.Union(b).Distinct().ToList();
您的問題可能是由於發送到SelectList
的查詢中缺少Select(x => x.Value)
表達式。 由於只能從接口的SelectList
中選擇一個值,因此添加表達式,然后僅返回列表中的不同值。 像這樣:
var a = db.CurrentIndexes.Include(m => m.Files).Where(m => m.Name == x && m.Files.Filename.Length > 4).Select(x => x.Files.Filename);
var b = db.CurrentIndexes.Include(m => m.Files).Where(m => m.PreviousName == x && m.Files.Filename.Length > 4).Select(x => x.Files.Filename);
var c = a.Union(b).Distinct().ToList();
查詢中的其他值(使結果集唯一)而不是SelectList
使用的值可能是導致您實際上未在列表中僅看到唯一值的原因。 只需在列表中選擇所需的列,然后使用.Distinct()
方法,即可獲得所需的結果。
編輯
如果要為SelectList
的Text
和Value
參數傳遞值,則可以設置一個類,例如,如果要為記錄或類似內容傳遞PK:
public class FileSysInfo
{
public int ID { get; set; }
public string Filename { get; set; }
}
然后,您可以選擇要用於選擇列表的兩個值:
var a = db.CurrentIndexes.Include(m => m.Files)
.Where(m => m.Name == x && m.Files.Filename.Length > 4)
.Select(x => new FileSysInfo()
{
ID = x.Files.ID,
Filename = x.Files.Filename
});
然后:一旦完成兩個查詢的設置,則var c = a.Union(b).Distinct().List()
。 然后在您的選擇列表中使用它:
ViewBag.sel = new SelectList(c, "ID", "Filename");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.