簡體   English   中英

使用Linq Union將列表傳遞給視圖會得到不明顯的結果

[英]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()方法,即可獲得所需的結果。

編輯

如果要為SelectListTextValue參數傳遞值,則可以設置一個類,例如,如果要為記錄或類似內容傳遞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.

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