C# 如何在linq C中使用多个条件#
这是我的Linq查询C# 如何在linq C中使用多个条件#,c#,linq,C#,Linq,这是我的Linq查询 var tmp = (from oScreenDef in listScreenDefinition join oSynSession in listSynSession on new { c1 = oScreenDef["venueCd"], c2 = oScreenDef["screenBytNum"] }
var tmp = (from oScreenDef in listScreenDefinition
join oSynSession in listSynSession on
new { c1 = oScreenDef["venueCd"], c2 = oScreenDef["screenBytNum"] }
equals new { c1 = oSynSession["cinemaId"], c2 = oSynSession["screenDetails"].AsBsonDocument["num"] }
join oSessionAreaCount in listSessionAreaCount on
new { c1 = oScreenDef["venueCd"] }
equals new { c1 = oSessionAreaCount["cinemaId"] }
join oPrices in listSynPrices on
new { c1 = oScreenDef["venueCd"], c2 = oSynSession["cinemaId"] }
equals new { c1 = oPrices["cinemaId"], c2 = oPrices["cinemaId"] }
select new { doc = oSynSession[0], oScreenDef }).ToList();
在这种情况下,oPrices
对象具有cinemaID
,它应该等于oScreenDef[“venueId”]
和oSynSession[“cinemaID”]
为此,我将两次oPrices[“cinemaId”]
作为C1
和C2
如何避免这种情况,以及如何改进此查询
请提出更好的办法
所有
listScreenDefinition
、ListSessionaCount
、listSynPrices
都是List
项,它们是从mongodb
查询中获取的。您可以使用let
(请参阅)并删除新的{c1=…}
。但我没有看到更多的优化:
var tmp = (from oScreenDef in listScreenDefinition
let oScreenDefVenueCd = oScreenDef["venueCd"] // let clause creates a "local variable" Inside a LINQ query
join oSynSession in listSynSession on
new { c1 = oScreenDefVenueCd, c2 = oScreenDef["screenBytNum"] }
equals new { c1 = oSynSession["cinemaId"], c2 = oSynSession["screenDetails"].AsBsonDocument["num"] }
join oSessionAreaCount in listSessionAreaCount on
oScreenDefVenueCd
equals oSessionAreaCount["cinemaId"]
join oPrices in listSynPrices on
new { c1 = oScreenDefVenueCd, c2 = oSynSession["cinemaId"] }
equals new { c1 = oPrices["cinemaId"], c2 = oPrices["cinemaId"] }
select new { doc = oSynSession[0], oScreenDef }).ToList();
更新
公共类MyItem
{
公开会议文件;
公共屏幕定义屏幕定义;
公共MyItem(SynSession文档,ScreenDef ScreenDef)
{
Doc=Doc;
ScreenDef=ScreenDef;
}
}
列出tmp=(来自listScreenDefinition中的OSScreenDef
let oScreenDefVenueCd=oScreenDef[“venueCd”]//let子句在LINQ查询中创建一个“局部变量”
在上的listSynSession中加入oSynSession
新的{c1=oscreeendefvenuecd,c2=oscreeendef[“screenBytNum”]}
等于新的{c1=oSynSession[“cinemaId”],c2=oSynSession[“screenDetails”]。AsBsonDocument[“num”]}
在上的listSessionAreaCount中加入oSessionAreaCount
OSCREENDEFENUECD
等于oSessionAreaCount[“cinemaId”]
在上的listSynPrices中加入操作
新的{c1=oScreenDefVenueCd,c2=oSynSession[“cinemaId”]}
等于新的{c1=oPrices[“cinemaId”],c2=oPrices[“cinemaId”]}
选择新的MyItem(oSynSession[0],OSScreenDef)).ToList();
rtpHarry更新说明:将Item重命名为MyItem以匹配顶部的类。您可以使用
let
在linq中分配变量,而不是重新查询它们。也许这对你有帮助?我是.Net的新手。。请给我硼化钾好吗。。还有一个是我声明为Var。如果我想声明为全局变量,然后我需要分配这些结果。需要为此提供什么类型?您不能,因为您创建了一个匿名类型。你必须定义一个结构并使用它。(我已经更新了我的帖子,告诉你怎么做)。
public class MyItem
{
public SynSession Doc;
public ScreenDef ScreenDef;
public MyItem(SynSession doc, ScreenDef screenDef)
{
Doc = doc;
ScreenDef = screenDef;
}
}
List<MyItem> tmp = (from oScreenDef in listScreenDefinition
let oScreenDefVenueCd = oScreenDef["venueCd"] // let clause creates a "local variable" Inside a LINQ query
join oSynSession in listSynSession on
new { c1 = oScreenDefVenueCd, c2 = oScreenDef["screenBytNum"] }
equals new { c1 = oSynSession["cinemaId"], c2 = oSynSession["screenDetails"].AsBsonDocument["num"] }
join oSessionAreaCount in listSessionAreaCount on
oScreenDefVenueCd
equals oSessionAreaCount["cinemaId"]
join oPrices in listSynPrices on
new { c1 = oScreenDefVenueCd, c2 = oSynSession["cinemaId"] }
equals new { c1 = oPrices["cinemaId"], c2 = oPrices["cinemaId"] }
select new MyItem(oSynSession[0], oScreenDef)).ToList();