Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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
C# 具有不同比较运算符的多个LINQ连接条件_C#_Linq_Telerik_Telerik Open Access - Fatal编程技术网

C# 具有不同比较运算符的多个LINQ连接条件

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

我正在尝试构建一个LINQ查询,该查询将容纳一个谓词的动态列表,但也提供两个表之间的多个非公平连接条件。我使用的ORM是针对Oracle数据库的Telerik开放访问/数据访问

下面是我试图在Linq中构建的PL-SQL查询

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); 
}