对于C#中的LINQ和实体框架来说还是比较新的,并且在解释为什么我似乎无法迭代作为List<>的非常基本的Where命令输出的结果时。我在类中有以下方法来返回结果(为简单起见,我在我的示例中使用了泛型变量名称):
public List<MyTable> GetMyList(int ThisID)
{
return MyEntities.MyTable.Where(c => c.ForeignKey == ThisID).AsEnumerable().ToList();
}
然后在我的页面代码中,我有以下内容来调用并遍历结果:
List<MyTable> Table1 = GetMyList(1);
Table1.ForEach(delegate(MyTable TableDelegate)
{
string Value = TableDelegate.Column1
});
除了非常重要的一点,“Column1
”的值永远不会改变之外,这一切都有效。在我正在处理的示例中,我使用我知道返回3条记录的值(在示例中为“ForeignKey
”)提交查询,对于这3条记录,我知道“{{1每个人都有所不同。然而,我得到的是第一条记录的3个实例。即,“Column1
”的值不会随着“ForEach”迭代而改变。我已经确认它正在使用断点正确迭代。
我尝试了不同的构造循环的方法,包括正常的Column1
语句,以及使用foreach
for
索引Count
的标准Table1
语句限制。相同的结果。
抓我的头......
答案 0 :(得分:1)
我不确定你想要完成什么,所以希望这至少有帮助。我更改了一些名称,以便更容易理解:
public void MyMethod()
{
// get records with the id 4
var myList = GetMyList(4);
// get the property called Column1 for each one of those records and add them to this list (for demonstration)
var listOfColumn1 = new List<string>(); // lets assume that column holds a string
foreach(User usr in myList)
{
listOfColumn1.Add(thing);
}
// or in a more linq-ish way
listOfColumn1 = myList.Select(record => record.Column1).ToList();
}
public List<User> GetMyList(int departmentId)
{
// return a list of users that have the specified department id
return MyEntities.Users.Where(user => user.DepartmentId== departmentId).ToList();
}
// OR do it in one operation
public void DisplayDepartmentUsers(int departmentId)
{
MyEntities.Users // from my user table
.Where(user => user.DepartmentId == departmentId) // get everyone with this department id
.Select(record => record.Column1) // only select the first column (a string in this case)
.ToList() // make a list out of the resultant enumerable
.ForEach(Console.WriteLine); // for each result, run this method (write out to console)
}
答案 1 :(得分:0)
我不认为这与你的问题有关,但我认为它会帮助你理解LINQ:
public List<MyTable> GetMyList(int ThisID)`
{
return MyEntities.MyTable.Where(c => c.ForeignKey == ThisID).AsEnumerable().ToList();`
}
在此示例中,您不需要使用AsEnumerable
,因为所有LINQ方法都返回IEnumerable<T>
。
答案 2 :(得分:0)
我弄清楚问题是什么。它与代码本身完全无关,这很好。我尝试查询的视图在输出中缺少唯一标识符列(PK列),如底层.edmx
对象中所示。一旦我加入,没问题。 select查询现在可以获取唯一的行。对我来说这似乎有点奇怪,但你去了。