我之前从未见过这个错误而且非常令人困惑,我基本上都在尝试做一些我说找到我所有位置(只返回一个)的东西,它匹配传入的位置名称和类型:
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){}
基本上它只是一个控制台应用程序。最近怎么回事?
完整错误消息: {“非静态方法需要目标。”}
注意:在这种情况下,作为“可能的答案”发布的问题没有帮助,因为我运行此代码的主要方法是静态的。
经过进一步调查,我发现名称和类型为空,因此我做了以下修复:
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();
答案 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();