非静态方法需要一个目标?

The*_*ebs 8 linq

我之前从未见过这个错误,而且非常令人困惑,我基本上都在尝试做一些我说找到我所有位置(只返回一个)的东西,它与传入的位置名称和类型匹配:

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();
Run Code Online (Sandbox Code Playgroud)

可能有一种更好的方法可以一举做到我想要的东西,但基本上我从列中获取名称(这来自csv文件),然后说,给我那些位置信息.在此之后,我说现在我已经拥有了所有的爵士乐,请给我一个这个名字及其类型的位置.

但我得到错误:

非静态方法需要目标

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

static void Main(string[] args){}
Run Code Online (Sandbox Code Playgroud)

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

  • db是上下文类,这应该是显而易见的.
  • 是我从csv文件中提取数据,在这种情况下,列[40]将类似于"纽约"

堆栈跟踪中的完整错误消息: {"非静态方法需要目标."}

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

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

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
}
Run Code Online (Sandbox Code Playgroud)

唉,我仍然得到错误: Location loc = db.Locations.Where(l => l.name == name && l.type == type.type).FirstOrDefault();

Der*_*ean 22

我今天发生了这件事.来发现,我这样做:

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

这里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);
Run Code Online (Sandbox Code Playgroud)

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

  • 很棒的解释!这是一个经常被遗忘的常见 Linq 问题,通常在 Linq 查询中使用局部对象的属性之前,我总是将它们评估为局部变量,因为你永远不知道其他人何时会盲目地重构你的代码或重新生成你的数据类启用延迟加载。 (2认同)