C# 如何在linq C中使用多个条件#

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"] }

这是我的Linq查询

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