C# 两个表连接时的动态LINQ查询
我想为LINQ查询动态地构建where子句,但我对如何进行和实现感到困惑 下面是不会编译的伪代码。给出错误消息 错误CS1503参数2:无法从“System.Linq.Expressions.BinaryExpression”转换为“System.Linq.Expressions.Expression>”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=
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;
}
}