LINQ有条件地添加加入

我有一个LINQ查询,我试图从2个表返回数据,但我加入的表是有条件的。

这就是我想做的事情:

if (teamType == "A"){ var query = from foo in context.People join foo2 in context.PeopleExtendedInfoA select foo; } else { var query = from foo in context.People join foo2 in context.PeopleExtendedInfoB select foo; } 

然后我会进一步过滤查询。 我显然无法以这种方式设置它,因为我无法访问if块之外的“查询”,但它显示了我正在尝试做的事情。 这是我稍后尝试使用查询执行的示例:

 if (state != null) { query = query.Where(p => p.State == state); } if (query != null) { var queryFinal = from foo in query select new PeopleGrid() { Name = foo.Name, Address = foo.Address, Hobby = foo2.Hobby } } 

我想要返回的是来自表foo的所有数据,然后来自连接表中的一个字段,但根据逻辑,连接表将有所不同。 PeopleExtendedInfoA和PeopleExtendedInfoB都有columb’Hobby’,但是我无法从连接表中访问’Hobby’,这是我需要从连接表中获得的唯一字段。

我该怎么做呢?

PeopleExtendedInfoAPeopleExtendedInfoB是否从相同的基类inheritance? 你可以创建一个IQueryable ,让linq提供者在你添加连接时为你解决它。 样品:

 IQueryable basePeople; if (teamType == "A") basePeople = context.PeopleExtendedInfoA; else basePeople = context.PeopleExtendedInfoB; var query = from foo in context.People join foo2 in basePeople on foo.Id equals foo2.PeopleId select new PeopleGrid() { Name = foo.Name, Address = foo.Address, Hobby = foo2.Hobby }; 

试试这样:

  var queryFinal = from foo in query where foo.State == state !=null ? state : foo.State select new PeopleGrid() { Name = foo.Name, Address = foo.Address, Hobby = foo2.Hobby } 

您可以查询包含相关字段的中间类型,或者如果查询足够简单,您可以使用匿名类型,如下所示。 重要的是, Join调用都具有相同的返回类型( { p.Name, a.Hobby }{ p.Name, b.Hobby }都将是相同的anon类型)。

 var baseQuery = context.People; var joined = type == "A" ? baseQuery.Join(PeopleExtendedInfoA, p => p.Id, a => a.PeopleId, (p, a) => new { p, a.Hobby }) : baseQuery.Join(PeopleExtendedInfoB, p => p.Id, b => b.PeopleId, (p, b) => new { p, b.Hobby }); var result = joined.Select(x => new { xpName, xpAddress, // etc. x.Hobby }; 

我想到了。 感谢大家的回复,它让我的大脑再次工作,并给了我一些新的想法(即使我没有直接采取任何一个)我意识到我需要在最后而不是开始那样做我不必处理不同类型的过滤。 这就是我做的:

 var query = from foo in context.People select foo; if (state != null) { query = query.Where(p => p.State == state); } if (query != null) { if (teamType == "A") { var queryFinal = from foo in query join foo2 in context.PeopleExtendedInfoA select new PeopleGrid() { Name = foo.Name, Address = foo.Address, Hobby = foo2.Hobby } } else { var queryFinal = from foo in query join foo2 in context.PeopleExtendedInfoB select new PeopleGrid() { Name = foo.Name, Address = foo.Address, Hobby = foo2.Hobby } } }