10

我以前从未见过这个错误,它非常令人困惑,我实际上是在尝试做一些事情,我说找到与传入的位置名称和类型匹配的所有位置(只会返回一个):

string name = columns[40];
Location type = db.Locations.Where(l => l.name == name).FirstOrDefault();
Location loc = db.Locations.Where(l => l.name == name && l.type == type.type).FirstOrDefault();

可能有一种更好的方法可以一举完成我想做的事情,但基本上我从列中获取名称(这来自 csv 文件),然后说,让我获取位置信息。在这之后,我说好了,既然我有所有的爵士乐,去给我找一个有这个名字和它的类型的位置。

但我得到了错误:

非静态方法需要一个目标

所有这些代码运行的顶级方法是:

static void Main(string[] args){}

本质上它只是一个控制台应用程序。发生什么了?

  • db是上下文类,这应该很明显。
  • columns是我从 csv 文件中提取数据,在这种情况下, columns[40] 将类似于“New York”

来自堆栈跟踪的完整错误消息: {“非静态方法需要一个目标。”}

注意:作为“可能的答案”发布的问题在这种情况下没有帮助,因为我运行此代码的主要方法是静态的。

经过进一步调查,我发现名称和类型为空,因此我进行了以下修复:

if (name != null)
{
    Location type = db.Locations.Where(l => l.name == name).FirstOrDefault();
    Location loc = db.Locations.Where(l => l.name == name && l.type == type.type).FirstOrDefault();
    locationNearbyId = loc.id;

    // More code
}

唉,我仍然在以下位置收到错误:Location loc = db.Locations.Where(l => l.name == name && l.type == type.type).FirstOrDefault();

4

3 回答 3

23

我今天发生了这种情况。来了解一下,我是这样做的:

Player player = db.Players
    .Where(p => p.ClubID == course.Club.ID && p.IsActive == true && p.Phone != null)
    .ToArray()
    .SingleOrDefault(p => p.Phone.FormatPhoneNumber() == phone);

course.Club我的数据库中通过 EF 进行延迟加载的位置。起初,我以为我的问题是FormatPhoneNumber扩展名,但后来发现删除course.Club.ID修复了问题:

int clubID = course.Club.ID;
Player player = db.Players
    .Where(p => p.ClubID == clubID && p.IsActive == true && p.Phone != null)
    .ToArray()
    .SingleOrDefault(p => p.Phone.FormatPhoneNumber() == phone);

因此,避免在后续的 LINQ 查询中使用从延迟加载的对象中收集的值 - 将它们分配给局部变量,然后在查询中使用这些变量。

于 2013-10-15T17:55:45.957 回答
4

事实证明,因为名称和类型可以为空,所以必须在 if 语句旁边设置类型,因此我必须在继续之前检查类型和名称是否为空:

name = collumns[40];
type = db.Locations.Where(l => l.name == name).FirstOrDefault();

if (name != null && type != null)
{
    Location loc = db.Locations.Where(l => l.name == name && l.type == type.type).FirstOrDefault();

    //More code....
}
于 2013-05-15T17:19:20.630 回答
0

事实上,问题是由于空“类型”对象造成的。我会这样解决:

var tType = type?.type;
Location loc = db.Locations.Where(l => l.name == name && (type != null && l.type == tType)).FirstOrDefault();
于 2017-12-01T09:55:51.413 回答