C# 具有不同比较运算符的多个LINQ连接条件
我正在尝试构建一个LINQ查询,该查询将容纳一个谓词的动态列表,但也提供两个表之间的多个非公平连接条件。我使用的ORM是针对Oracle数据库的Telerik开放访问/数据访问 下面是我试图在Linq中构建的PL-SQL查询C# 具有不同比较运算符的多个LINQ连接条件,c#,linq,telerik,telerik-open-access,C#,Linq,Telerik,Telerik Open Access,我正在尝试构建一个LINQ查询,该查询将容纳一个谓词的动态列表,但也提供两个表之间的多个非公平连接条件。我使用的ORM是针对Oracle数据库的Telerik开放访问/数据访问 下面是我试图在Linq中构建的PL-SQL查询 SELECT DISTINCT "asset".asset_number , "hdr".revision , "hdr".syscfg_booth_num , "hdr".message_id , "hdr".msg_num
SELECT DISTINCT
"asset".asset_number
, "hdr".revision
, "hdr".syscfg_booth_num
, "hdr".message_id
, "hdr".msg_num
, "hdr".msg_create_date
, "hdr".msg_xmit_date
, "hdr".skytel_date
FROM xfe_rep.wi_transmits "hdr"
INNER JOIN xfe_rep.pin2pagerid "asset" ON
"hdr".pin = "asset".wireless_pager_pin
AND
"hdr".msg_create_date >= "asset".effective_start_date
AND
"hdr".msg_create_date <= "asset".effective_end_date
WHERE
"hdr".field_one = ??
AND
"hdr".field_two = ??;
选择DISTINCT
“资产”。资产编号
“hdr”,修订版
,hdr.syscfg\u booth\u num
,“hdr”。消息\u id
,“hdr”。msg_num
,hdr.msg\u create\u date
,hdr.msg\u xmit\u日期
“hdr”,skytel\u日期
从xfe_rep.wi_传输“hdr”
上的内部联接xfe_rep.Pin2文件夹“资产”
“hdr”.pin=“asset.”无线寻呼机\u pin
及
“hdr”.msg\u create\u date>=“asset”.effective\u start\u date
及
“hdr”.msg_create_date=,assetMap.EffectiveStartDate assetMap.EffectiveEndDate>=wiTransmits.MessageCreateDate);
foreach(joinPredicate中的表达式筛选器)
{
query=query.Where(filter);//不起作用
}
foreach(messagePredicate中的表达式筛选器)
{
query=query.Where(过滤器);
}
有人知道怎么做吗?如果
WITransmit
具有类似AssetMap
(where wiTransmits.AssetMap.EffectiveStartDate)的导航属性,这就容易多了,除非这是EF-Core,否则无论您是否使用join
+where
,LINQ查询都应该生成单个SQL“第一次通过”应该可以工作。不幸的是,我被一个没有外键的现有数据库困住了(我相信Telerik需要外键来定义导航属性)…而且它不是EF Core(但感谢你指出我从未提到我使用的ORM!)…如果WITransmit
具有类似AssetMap
(where wiTransmits.AssetMap.EffectiveStartDate)的导航属性,则这一切都会容易得多。除非这是EF核心,否则LINQ查询应生成单个SQL,而不管您是否使用join
+where
。您的“第一关”“应该可以工作。不幸的是,我被困在一个没有外键的现有数据库中(我相信Telerik需要外键来定义导航属性)…而且它不是EF Core(但感谢您指出我从未提到我使用的ORM!)。。。
IQueryable<WITransmits> query = from wiTransmits in ctx.WITransmits
join assetMap in ctx.AssetNumberMaps
on wiTransmits.PIN equals assetMap.PIN
where
assetMap.EffectiveStartDate <= wiTransmits.MessageCreateDate &&
assetMap.EffectiveEndDate >= wiTransmits.MessageCreateDate
select wiTransmits;
foreach (Expression<Func<WITransmits, Boolean>> filter in messagePredicate)
{
query = query.Where(filter);
}
IQueryable<WITransmits> query = from wiTransmits in ctx.WITransmits
join assetMap in ctx.AssetNumberMaps
on wiTransmits.PIN equals assetMap.PIN
select wiTransmits;
foreach (Expression<Func<WITransmits, Boolean>> filter in messagePredicate)
{
query = query.Where(filter);
}
IQueryable<WITransmits> query = from wiTransmits in ctx.WITransmits
join assetMap in ctx.AssetNumberMaps on
new { wiTransmits.PIN, wiTransmits.MessageCreateDate, wiTransmits.MessageCreateDate } equals
new { assetMap.PIN, assetMap.EffectiveStartDate, assetMap.EffectiveEndDate }
select wiTransmits;
foreach (Expression<Func<WITransmits, Boolean>> filter in messagePredicate)
{
query = query.Where(filter);
}
IQueryable<WITransmits> query = from wiTransmits in ctx.WITransmits
join assetMap in ctx.AssetNumberMaps
on wiTransmits.PIN equals assetMap.PIN
select wiTransmits;
var joinPredicate = new List<Expression<Func<WITransmits, AssetNumberMaps, Boolean>>>();
joinPredicate.Add((wiTransmits, assetMap) => assetMap.EffectiveStartDate <= wiTransmits.MessageCreateDate);
joinPredicate.Add((wiTransmits, assetMap) => assetMap.EffectiveEndDate >= wiTransmits.MessageCreateDate);
foreach (Expression<Func<WITransmits, AssetNumberMaps, Boolean>> filter in joinPredicate)
{
query = query.Where(filter); // DOES NOT WORK
}
foreach (Expression<Func<WITransmits, Boolean>> filter in messagePredicate)
{
query = query.Where(filter);
}