Linq 非静态方法需要一个目标?
我以前从未见过这个错误,而且它非常混乱,我基本上是在尝试做一些事情,我说“查找我所有位置”(将只返回一个),这些位置与传入的位置名称和类型匹配:Linq 非静态方法需要一个目标?,linq,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.typ
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]类似于“纽约”
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()代码>结果表明,由于名称和类型可以为空,因此必须在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....
}
我今天遇到了这种事。来看看吧,我是这么做的:
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查询中使用从延迟加载对象收集的值-将它们分配给局部变量,然后在查询中使用这些变量。事实上,问题是由于空“type”对象造成的。
我会这样解决:
var tType = type?.type;
Location loc = db.Locations.Where(l => l.name == name && (type != null && l.type == tType)).FirstOrDefault();
错误到底在哪里?什么是db
?什么是列
?能否发布完整的错误消息?它说的是哪种非静态方法?在哪一行?问题的可能副本已更新,可能的答案对我没有帮助。请详细介绍一下@JonSkeet请在回答之前阅读完整问题执行第二个表达式中的name
或type.type
中的任何一个碰巧为空?这似乎不太可能是原因,因为您给出的错误消息听起来像是真的编译器错误。但后来你说你得到它作为一个例外。不幸的是,由于你的问题相当模糊和不完整,很难帮助你或确定这个答案是否真的相关。@JonSkeet当你不知道它的意思时,这个错误非常令人困惑。在使用linq查询返回的变量时,我也遇到了这个错误(我的查询回调了一个对象)。那个对象原来是空的。一旦你知道它是一个空对象,它就很有意义了。您正在调用一个没有目标的非静态方法(type.type
)(目标type
为空)。这只是一条非常隐晦的错误信息。令人敬畏的解释!这是一个常见的Linq问题,经常会被遗忘,作为一项规则,我总是在Linq查询中使用局部变量之前对局部对象的属性进行求值,因为你永远不知道别人什么时候会盲目地重构你的代码,或者在启用延迟加载的情况下重新生成你的数据类。