Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
PredicateBuilder+Join+VB.NET_Vb.net_Linq_Linq To Sql_Join_Predicatebuilder - Fatal编程技术网

PredicateBuilder+Join+VB.NET

PredicateBuilder+Join+VB.NET,vb.net,linq,linq-to-sql,join,predicatebuilder,Vb.net,Linq,Linq To Sql,Join,Predicatebuilder,我有一个包含3个表的数据库 Products Table Suppliers Table Categories Table Id Id Id ProductName SupplierName CategoryName Quantity .

我有一个包含3个表的数据库

Products Table Suppliers Table Categories Table Id Id Id ProductName SupplierName CategoryName Quantity . . SupplierId . . CategoryId . . 。 . . 箱子供应商

                            SupplierAlso = Entry

                        Case "Category"

                            CategoryAlso = Ent 
下一个


那么你觉得有没有更好的办法?当然是的?愚蠢的问题,但在哪里?

所以我会这样做。我简化了where语句,但我想你会明白我的意思:

dim checkCategoryName as boolean=true
dim checkSupplier as boolean=true
dim checkQuantity as boolean=true
dim query= db.Products.Select (function(p) p)
if checkCategoryName then
    query=query _ 
            .Where (function(p) db.Categories.Where (function(c) c.CategoryName="??" ) _ 
            .Select (function(c) c.Id) _ 
            .Contains(p.CategoryId))
end if
if checkSupplier then
    query=query _ 
            .Where (function(q) db.Suppliers.Where (function(s) s.SupplierName="??") _ 
            .Select (function(s) s.Id) _ 
            .Contains(q.SupplierId))
end if
if checkQuantity then
    query=query.Where (function(q) q.Quantity<10)
end if
dim result=query.ToList()

其中db是linq数据上下文。

谢谢,但这不是我要找的,Kimo,s,它喜欢你的解决方案,但我不知道为什么我不能检测CategoryName字段,即使是以.ItemCategoryName.Tostring的后期绑定方式
            Dim f As ProductsDataTable = Products.Product
            Dim tmp As IEnumerable(Of Products) = New ProductsDataTable().AsEnumerable()
            tmp = f.AsEnumerable.Where(pred.Compile)


            Dim qry

             If CategoryAlso = "" And SupplierAlso = "" Then
                q = (From prods In tmp
                      Join Cats In Categories
                      On prods.CategoryId Equals Cats.ID
                      Join Supps In Suppliers
                      On Supps.ID Equals prods.SupplierId
                      Select Supps.SupplierName, Cats.CategoryName, prods.ID _ 
                      , prods.ProductName,   prods.UnitPrice, prods.CategoryId _ 
                      , prods.SupplierId, prods.Location, _
                      prods.Description, prods.SellPrice, prods.CountInStock _ 
                      , prods.ProductionDate, prods.ExpiryDate, _
                      prods.ProductType, prods.ProductSeason).ToList

            ElseIf CategoryAlso <> "" And SupplierAlso <> "" Then

                q = (From prods In tmp
                      Join Cats In Categories
                      On prods.CategoryId Equals Cats.ID
                       Join Supps In Suppliers
                       On Supps.ID Equals prods.SupplierId
                       Where Cats.CategoryName.IndexOf((CategoryAlso)  
                 ,  StringComparison.OrdinalIgnoreCase) >= 0 And _                                Supps.SupplierName.IndexOf((SupplierAlso), _ 
                      StringComparison.OrdinalIgnoreCase) >= 0
                      Select Supps.SupplierName, Cats.CategoryName, prods.ID, _  
                     prods.ProductName, prods.UnitPrice, prods.CategoryId, _ 
                     prods.SupplierId, prods.Location, _
                      prods.Description, prods.SellPrice, prods.CountInStock,  _ 
                      prods.ProductionDate, prods.ExpiryDate, _
                      prods.ProductType, prods.ProductSeason).ToList

            ElseIf SupplierAlso <> "" And CategoryAlso = "" Then

                q = (From prods In tmp
                        Join Cats In Categories
                        On Cats.ID Equals prods.CategoryId
                        Join Supps In Suppliers
                        On prods.SupplierId Equals Supps.ID Where _ 
                         Supps.SupplierName.IndexOf((SupplierAlso),  _ 
                         StringComparison.OrdinalIgnoreCase) >= 0
                        Select Cats.CategoryName, Supps.SupplierName, prods.ID,  _ 
                        prods.ProductName, prods.UnitPrice, prods.CategoryId, _ 
                        prods.SupplierId, prods.Location, _
                        prods.Description, prods.SellPrice, prods.CountInStock, _  
                        prods.ProductionDate, prods.ExpiryDate, _
                        prods.ProductType, prods.ProductSeason).ToList

            ElseIf CategoryAlso <> "" And SupplierAlso = "" Then

                q = (From prods In tmp
                        Join Cats In Categories
                        On prods.CategoryId Equals Cats.ID Where Cats.CategoryName.IndexOf _ 
                        ((CategoryAlso), StringComparison.OrdinalIgnoreCase) >= 0
                        Join Supps In Suppliers On Supps.ID Equals prods.SupplierId
                        Select Supps.SupplierName, Cats.CategoryName, prods.ID, _ 
                        prods.ProductName, prods.UnitPrice, prods.CategoryId, _ 
                        prods.SupplierId, prods.Location, _
                        prods.Description, prods.SellPrice, prods.CountInStock, _ 
                        prods.ProductionDate, prods.ExpiryDate, _
                        prods.ProductType, prods.ProductSeason).ToList

            End If
                    DataGridView2.Rows.Add _ 
                   ({.ID, .ProductName, .UnitPrice, .categoryname, .suppliername, .Location, _
                                            .Description, .SellPrice, .CountInStock, _                                                .ProductionDate, .ExpiryDate, _
                                            .ProductType, .ProductSeason})

                End With

            Next
dim checkCategoryName as boolean=true
dim checkSupplier as boolean=true
dim checkQuantity as boolean=true
dim query= db.Products.Select (function(p) p)
if checkCategoryName then
    query=query _ 
            .Where (function(p) db.Categories.Where (function(c) c.CategoryName="??" ) _ 
            .Select (function(c) c.Id) _ 
            .Contains(p.CategoryId))
end if
if checkSupplier then
    query=query _ 
            .Where (function(q) db.Suppliers.Where (function(s) s.SupplierName="??") _ 
            .Select (function(s) s.Id) _ 
            .Contains(q.SupplierId))
end if
if checkQuantity then
    query=query.Where (function(q) q.Quantity<10)
end if
dim result=query.ToList()