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

时间:2013-05-15 17:00:41

标签: 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();

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

但我收到错误:

非静态方法需要目标

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

static void Main(string[] args){}

基本上它只是一个控制台应用程序。最近怎么回事?

  • db 是上下文类,这应该是显而易见的。
  • 是我从csv文件中提取数据,在这种情况下,列[40]会像“纽约”
来自堆栈跟踪的

完整错误消息: {“非静态方法需要目标。”}

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

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

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();

3 个答案:

答案 0 :(得分:21)

今天我发生了这件事。来发现,我是这样做的:

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查询中使用从延迟加载的对象中收集的值 - 将它们分配给局部变量,然后在查询中使用这些变量。

答案 1 :(得分:4)

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

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....
}

答案 2 :(得分:0)

事实上,问题是由于null" type"宾语。 我会这样解决:

var tType = type?.type;
Location loc = db.Locations.Where(l => l.name == name && (type != null && l.type == tType)).FirstOrDefault();