将列表传递给使用Linq Union查看会导致非截然不同的结果

时间:2013-12-11 18:52:03

标签: c# linq asp.net-mvc-4

使用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,看看我是否无法得到我需要的明显结果。

我很感激任何建议

2 个答案:

答案 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()