【问题标题】:Converting T-sql query into linq将 T-sql 查询转换为 linq
【发布时间】:2017-03-04 20:01:03
【问题描述】:

我要翻译的查询是:

SELECT
    Products.id, [Products].Name 
FROM 
    [Products] 
LEFT JOIN 
    [AvailableProducts] ON [AvailableProducts].IdProduct = [Products].Id
                        AND [AvailableProducts].IdUser = 'daa8ee71-f1d7-4b41-aa1c-464ae730dd63' 
WHERE 
   ([AvailableProducts].IdProduct IS NULL)

我正在尝试用这个 Linq 代码解决这个问题:

public void DataBindGridProducts(string idUser)
{
     List<Product> data = new List<Product>();

     var con = from test in db.AvailableProducts 
               join product in db.Products on new { test.IdProduct, test.IdUser} equals new { product.Id, idUser} 
               select new
                       {
                           surname = product.Name,
                       };

     grdConnectedProduct.DataSource = data;
     grdConnectedProduct.DataBind();
}

但这是不正确的。请帮帮我!

【问题讨论】:

    标签: sql asp.net entity-framework linq tsql


    【解决方案1】:
    public void DataBindGridProducts(string idUser)
    {
        List<Product> data = new List<Product>();
    
        var con = from product in db.Products
                  join ap in db.AvailableProducts on new { x= (int)product.Id, y = product.idUser } equals new { x = (int)ap.IdProduct, y = ap.IdUser }
                  where product.IdProduct = null
                  select new
                          {
                              surname = product.Name,
                          };
    
        grdConnectedProduct.DataSource = data;
        grdConnectedProduct.DataBind();
    }
    

    而你使用 lambda 表达式

    我认为下面的代码应该可以工作

    public void DataBindGridProducts(string idUser)
    {
        List<Product> data = new List<Product>();
    
        var con = db.Products.Join(db.AvailableProducts,
                                   product => new{(int)product.Id, product.idUser},
                                   ap => new { (int)ap.IdProduct, ap.IdUser },
                                   (product, ap) => product)
                             .Where(product => product.IdProduct = null)
                             .Select(x => x new
                                            {
                                                  surname = x.Name,
                                            })
                             .ToList();
    
        grdConnectedProduct.DataSource = data;
        grdConnectedProduct.DataBind();
    }
    

    【讨论】:

      【解决方案2】:

      你的 t-sql 查询等于这个查询:

      SELECT
          [product].[Id],
          [product].[Name]
      FROM
          [Products] [product]
              LEFT JOIN (
                  SELECT
                      [j].[IdProduct],
                      [j].[IdUser]
                  FROM
                      [AvailableProducts] [j]
                  WHERE
                      [j].[IdUser] = N'daa8ee71-f1d7-4b41-aa1c-464ae730dd63'
              ) [t1] ON [product].[Id] = [t1].[IdProduct]
      WHERE
          [t1].[IdProduct] IS NULL AND [t1].[IdUser] IS NULL
      

      而 Linq 查询有这样的观点:

      var availableProductsQuery = from ap in db.AvailableProducts
                                                   where ap.IdUser == "daa8ee71-f1d7-4b41-aa1c-464ae730dd63"
                                                   select ap;
      
                      var con = from product in db.Products.AsQueryable()
                                join test in availableProductsQuery
                                  on product.Id equals test.IdProduct into j
                                from ap in j.DefaultIfEmpty()
                                where ap == null
                                select product;
      

      【讨论】:

        【解决方案3】:

        我修好了:

        var o = (from p in db.Products
                        join p2 in db.AvailableProducts on new { f1 = (int)p.Id, f2 = idUser } equals new { f1 = (int)p2.IdProduct, f2 = p2.IdUser }
        
                        into temp
                        from x in temp.DefaultIfEmpty()
                         where x.IdProduct == null
                         select new { f1 = p.Name});
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-17
          相关资源
          最近更新 更多