gpt4 book ai didi

c# - 在 LINQ 中有条件地加入

转载 作者:太空宇宙 更新时间:2023-11-03 14:11:22 24 4
gpt4 key购买 nike

所以我在使用 linq 时遇到了一点问题。我希望连接成为 OUTER JOIN 或 INNER JOIN,具体取决于表中的值是否被过滤

外连接:

var query = (from tblA in dc.tblA
join tblB in GetMyTable() on tblA.Ref equals tblB.RefA into joinedTblB
from tblB in joinedTblB.DefaultIfEmpty()
select tblA);

内部连接:

var query = (from tblA in dc.tblA
join tblB in GetMyTable() on tblA.Ref equals tblB.RefA into joinedTblB
from tblB in joinedTblB
select tblA);

我想要的是将它组合在同一个查询中,并通过检查某些条件来执行 OUTER JOIN 或 INNER JOIN,如下所示:

var query = (from tblA in dc.tblA
join tblB in GetMyTable() on tblA.Ref equals tblB.RefA into joinedTblB
from tblNEWB in ((checkCondition==false) ? joinedTblB.DefaultIfEmpty() : joinedTblB)
select new {
tblA.ValueA,
tblNEWB.ValueB
});

我希望这会起作用,但我收到一条错误消息:“InvalidOperationException:成员访问‘tblB’的‘System.String ValueB’在类型‘System.Collections.Generic.IEnumerable’1 [tblB] 上不合法”

我是不是漏掉了什么?

更新:

我想要的是一个外连接,但是当在 tlbB 上设置条件时,linq 没有产生我希望的查询。打开 SQL Profiler 会给出以下查询:

LEFT OUTER JOIN tblB ON tblA.Ref = tblB.REfA AND tlbB.Key = '100'

虽然正确的查询应该是:

LEFT OUTER JOIN tblB ON tblA.Ref = tblB.RefA
WHERE tblB.Key = '100'

原因是我的 GetMyTable 函数为连接中的表设置了条件。

最佳答案

What I want is to combine this in the same query, and by checking some condition do either an OUTER JOIN or an INNER JOIN

获得所需内容的第一步是认识到需要两个不同的 sql 语句。 LinqToSql 不会将您的条件发送到数据库中,因此数据库可以根据值确定应该发生哪种连接。

第二步,是切换到方法语法。这种语法更容易根据条件组合。

第三步,是放弃匿名类型。你必须做一些令人不快的事情来声明你需要用那些跑来跑去的查询构造的变量。只需创建一个具有您需要的属性的类型并使用它。

public class AandB
{
public A TheA {get;set;}
public B TheB {get;set;}
}

IQueryable<A> queryA = dc.TblA.AsQueryable();

IQueryable<AandB> queryAandB = null;

if (checkCondition)
{
//inner join
queryAandB = queryA
.Join(
GetMyTable(),
a => a.Ref, b => b.RefA,
(a, b) => new AandB() {TheA = a, TheB = b}
);
}
else
{
// left join
queryAandB = queryA
.GroupJoin(
GetMyTable(),
a => a.Ref, b => b.RefA,
(a, g) => new {a, g}
)
.SelectMany(
x => x.g.DefaultIfEmpty(),
(x, b) => new AandB(){TheA = x.a, TheB = b}
);
}

List<AandB> results = queryAandB.ToList();

关于c# - 在 LINQ 中有条件地加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7767847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com