如何在LINQ多表Join语句中添加额外过滤条件?
LINQ连接Table2时添加额外条件的正确方式
你直接在join语句的on后面加&& t2.Active=true会报错,因为LINQ的join语法要求on后面只能是键的相等匹配,不能直接附加逻辑条件。你可以用以下两种方法实现需求:
方法1:在Join中使用复合键(连接阶段直接过滤)
通过创建匿名类型,把Id相等和Active=true作为连接的复合条件,这样就能在连接时就过滤掉非Active的t2记录:
var Result = ( from t1 in dbContext.Table1 join t2 in dbContext.Table2 on new { t1.Id, Active = true } equals new { t2.Id, t2.Active } join t3 in dbContext.Table3 on t1.Id equals t3.Id where t1.CategoryUId == Input.CategoryUId select new CategoryInfo { Table1ID = t1.Id, Table1Name = t1.Name, TableTypeUid = t1.TypeUId, ProductName = t2.ProductName, BrandName = t3.BrandName } ).ToList();
方法2:先连接再过滤(可读性更强)
先完成t1和t2的基础连接,再用where子句过滤t2的Active状态,这种写法更直观易懂:
var Result = ( from t1 in dbContext.Table1 join t2 in dbContext.Table2 on t1.Id equals t2.Id join t3 in dbContext.Table3 on t1.Id equals t3.Id where t1.CategoryUId == Input.CategoryUId && t2.Active == true select new CategoryInfo { Table1ID = t1.Id, Table1Name = t1.Name, TableTypeUid = t1.TypeUId, ProductName = t2.ProductName, BrandName = t3.BrandName } ).ToList();
另外注意你原代码的where开头多了个多余的&&,记得删掉,否则也会引发语法错误。
内容的提问来源于stack exchange,提问作者Pinky
相关产品推荐
相关产品推荐

