Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 非静态方法需要一个目标?_Linq - Fatal编程技术网

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查询中使用局部变量之前对局部对象的属性进行求值,因为你永远不知道别人什么时候会盲目地重构你的代码,或者在启用延迟加载的情况下重新生成你的数据类。