使用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中传递查询(ViewBag.d = c.ToList();
)我得到了许多方面的所有实例(CurrentIndexes
)。
我已经尝试过各种方式来查询c
并将其作为模型或通过ViewBag
传递,但我收到的错误是说我的结果与所需的收集类型不匹配视图所以我退回到使用ViewBag
,看看我是否无法得到我需要的明显结果。
我很感激任何建议
答案 0 :(得分:0)
尝试使用像这样的Distinct()子句:
var c = a.Union(b).Distinct().ToList();
答案 1 :(得分:0)
您的问题可能是由于您发送给Select(x => x.Value)
的查询中缺少SelectList
表达式。由于您只能从界面中的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()
方法即可获得所需的结果。
修改强>
如果您想传递Text
的{{1}}和Value
参数的值,那么您可以设置一个类,例如如果你想传入PK的记录或类似的东西:
SelectList
然后,您可以选择要用于选择列表的两个值:
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()