Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.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 - Fatal编程技术网

C# 两个表连接时的动态LINQ查询

C# 两个表连接时的动态LINQ查询,c#,linq,C#,Linq,我想为LINQ查询动态地构建where子句,但我对如何进行和实现感到困惑 下面是不会编译的伪代码。给出错误消息 错误CS1503参数2:无法从“System.Linq.Expressions.BinaryExpression”转换为“System.Linq.Expressions.Expression>” var tbl1=表达式参数(typeof(DBT_Master),“x”); var tbl2=表达式参数(typeof(DBT_MASTER_ADDRESS),“p”); var exp=

我想为LINQ查询动态地构建where子句,但我对如何进行和实现感到困惑

下面是不会编译的伪代码。给出错误消息

错误CS1503参数2:无法从“System.Linq.Expressions.BinaryExpression”转换为“System.Linq.Expressions.Expression>”

var tbl1=表达式参数(typeof(DBT_Master),“x”);
var tbl2=表达式参数(typeof(DBT_MASTER_ADDRESS),“p”);
var exp=表达式和(表达式常数(true)、表达式常数(true));
如果(客户代码!=“”)
{
exp=表达式。和(
表达式。常数(真),
Lambda(
表达式。相等(
Expression.Property(tbl1,“客户代码”),
表达式.常量(自定义代码)
),
tbl1
)
);
}
如果(站点号!=“”)
{
exp=表达式和(exp,
Lambda(
表达式。相等(
Expression.Property(tbl2,“AddressCode”),
表达式.常量(siteNo)
),
tbl2
)
);
}
var results=(从db.DBT_Master中的x开始)
将p加入x上的db.DBT\u MASTER\u地址。CustomerCode等于p.CustCode
选择x)。其中(exp);

我找到了解决你问题的办法。我用IQueryable模拟它,效果很好。您只需要将list.AsQueryable()替换为db.DBT_Master,将list2替换为db.DBT_Master_地址

工作示例如下:

class MainClass
    {
        public static void Main(string[] args)
        {
            List<DBT_Master> list = new List<DBT_Master>();
            list.Add(new DBT_Master { CustomerCode = "test" });
            list.Add(new DBT_Master { CustomerCode= "test1" });
            list.Add(new DBT_Master { CustomerCode = "test12" });
            list.Add(new DBT_Master { CustomerCode = "test13" });

            List<DBT_MASTER_ADDRESS> list2 = new List<DBT_MASTER_ADDRESS>();
            list2.Add(new DBT_MASTER_ADDRESS { AddressCode = "1234", CustCode="test" });
            list2.Add(new DBT_MASTER_ADDRESS { AddressCode = "asdfs", CustCode = "test" });
            list2.Add(new DBT_MASTER_ADDRESS { AddressCode = "afsadfas" });
            list2.Add(new DBT_MASTER_ADDRESS { AddressCode = "fdsa" });

            var customerCode = "test";
            var siteNo = "1234";

            var query = (from x in list.AsQueryable()
                         join p in list2.AsQueryable() on x.CustomerCode equals p.CustCode
                         select new { DBT_Master = x, DBT_MASTER_ADDRESS = p });

            if (customerCode != "")
            {
                query = query.Where(x => x.DBT_Master.CustomerCode == customerCode);
            }

            if (siteNo != "")
            {
                query = query.Where(x => x.DBT_MASTER_ADDRESS.AddressCode == siteNo);
            }

        query.Select(x => x.DBT_Master).ToList().ForEach(x => Console.WriteLine(x));
        }
    }

    class DBT_Master
    {
        public string CustomerCode { get; set; }

        public override string ToString()
        {
            return CustomerCode;
        }
    }

    class DBT_MASTER_ADDRESS {
        public string AddressCode { get; set; }
        public string CustCode { get; set; }

        public override string ToString()
        {
            return AddressCode + " " + CustCode;
        }
    }
class类main类
{
公共静态void Main(字符串[]args)
{
列表=新列表();
添加(新的DBT_主机{CustomerCode=“test”});
添加(新的DBT_主机{CustomerCode=“test1”});
添加(新的DBT_主机{CustomerCode=“test12”});
添加(新的DBT_主机{CustomerCode=“test13”});
List list2=新列表();
列表2.Add(新的DBT_主地址{AddressCode=“1234”,CustCode=“test”});
列表2.Add(新的DBT_主地址{AddressCode=“asdfs”,CustCode=“test”});
列表2.Add(新的DBT_主地址{AddressCode=“afsadfas”});
列表2.Add(新的DBT_主地址{AddressCode=“fdsa”});
var customerCode=“测试”;
var siteNo=“1234”;
var query=(来自list.AsQueryable()中的x)
在x上的list2.AsQueryable()中加入p。CustomerCode等于p.CustCode
选择新的{DBT_Master=x,DBT_Master_ADDRESS=p});
如果(客户代码!=“”)
{
query=query.Where(x=>x.DBT\u Master.CustomerCode==CustomerCode);
}
如果(站点号!=“”)
{
query=query.Where(x=>x.DBT\u MASTER\u ADDRESS.AddressCode==siteNo);
}
Select(x=>x.DBT_Master).ToList().ForEach(x=>Console.WriteLine(x));
}
}
类DBT_主机
{
公共字符串自定义代码{get;set;}
公共重写字符串ToString()
{
返回客户代码;
}
}
类DBT\u主地址{
公共字符串地址代码{get;set;}
公共字符串CustCode{get;set;}
公共重写字符串ToString()
{
返回地址代码+“”+客户代码;
}
}

当您运行程序时,它会打印“test”作为结果,因为只有一个数据与给定条件匹配(customerCode=test和AddressCode=1234,并在customerCode=CustCode上连接)

您期望的where表达式是什么?你能分享它吗?基本上我是在试图构造customerCode和siteNo都有值的情况下:其中customerCode=customerCode和AddressCode=siteNo如果customerCode有值而siteNo没有值,那么其中customerCode=customerCode如果siteNo有值而customerCode没有值,那么其中AddressCode=siteNo,最后,如果siteNo和customerCode都没有值,则为Where(true)
class MainClass
    {
        public static void Main(string[] args)
        {
            List<DBT_Master> list = new List<DBT_Master>();
            list.Add(new DBT_Master { CustomerCode = "test" });
            list.Add(new DBT_Master { CustomerCode= "test1" });
            list.Add(new DBT_Master { CustomerCode = "test12" });
            list.Add(new DBT_Master { CustomerCode = "test13" });

            List<DBT_MASTER_ADDRESS> list2 = new List<DBT_MASTER_ADDRESS>();
            list2.Add(new DBT_MASTER_ADDRESS { AddressCode = "1234", CustCode="test" });
            list2.Add(new DBT_MASTER_ADDRESS { AddressCode = "asdfs", CustCode = "test" });
            list2.Add(new DBT_MASTER_ADDRESS { AddressCode = "afsadfas" });
            list2.Add(new DBT_MASTER_ADDRESS { AddressCode = "fdsa" });

            var customerCode = "test";
            var siteNo = "1234";

            var query = (from x in list.AsQueryable()
                         join p in list2.AsQueryable() on x.CustomerCode equals p.CustCode
                         select new { DBT_Master = x, DBT_MASTER_ADDRESS = p });

            if (customerCode != "")
            {
                query = query.Where(x => x.DBT_Master.CustomerCode == customerCode);
            }

            if (siteNo != "")
            {
                query = query.Where(x => x.DBT_MASTER_ADDRESS.AddressCode == siteNo);
            }

        query.Select(x => x.DBT_Master).ToList().ForEach(x => Console.WriteLine(x));
        }
    }

    class DBT_Master
    {
        public string CustomerCode { get; set; }

        public override string ToString()
        {
            return CustomerCode;
        }
    }

    class DBT_MASTER_ADDRESS {
        public string AddressCode { get; set; }
        public string CustCode { get; set; }

        public override string ToString()
        {
            return AddressCode + " " + CustCode;
        }
    }