复杂的 Linq c# 查询

3

我在LinqPad中尝试了这个。

我有以下数据和Linq查询,应该只返回1条记录和2张图片,但却返回了2条记录和4张图片。

我知道我做错了什么,但不知道是什么。我正在寻找用户详细信息+汽车详细信息+用户(0b3c2ba5-1538-4557-a6c0-7de701fd83e7)的图像。

这与竞标有关,因为当我删除用户(0b3c2ba5-1538-4557-a6c0-7de701fd83e7)的一个竞标时,我就会得到1条记录和2张图片。

表格
------

表格 竞标

id      cardid  bidamount   dateplaced          usedid  

43  83  625 2012-11-05 16:12:51.600 a5d383e0-0c2c-44cf-9da1-0ce364b1dbdc  
44  86  575 2012-11-05 16:15:02.257 a5d383e0-0c2c-44cf-9da1-0ce364b1dbdc  
45  83  650 2012-11-05 16:15:07.283 a5d383e0-0c2c-44cf-9da1-0ce364b1dbdc  
46  86  600 2012-11-05 17:45:04.140 a5d383e0-0c2c-44cf-9da1-0ce364b1dbdc  
47  86  625 2012-11-05 17:45:08.867 a5d383e0-0c2c-44cf-9da1-0ce364b1dbdc  
49  83  750 2012-11-07 13:40:37.590 0b3c2ba5-1538-4557-a6c0-7de701fd83e7  
52  83  850 2012-11-08 13:40:37.590 0b3c2ba5-1538-4557-a6c0-7de701fd83e7 

用户详情表

userid                                  city    state  
0b3c2ba5-1538-4557-a6c0-7de701fd83e7    Sydney  NSW  

汽车表

id  name     descr   listingOption priceStarting priceReserve  
83  Valiant  Old Car     2              1000         1500  
86  Volvo    Safe Car    3              3000         4500 

拍卖图片数据表

id         image                                              belongs_to  
71  images/a5d383e0-0c2c-44cf-9da1-0ce364b1dbdc/alpaca.JPG  83  
72  images/a5d383e0-0c2c-44cf-9da1-0ce364b1dbdc/a_bag.jpg   83  
75  images/a5d383e0-0c2c-44cf-9da1-0ce364b1dbdc/alpaca.JPG  86  
76  images/a5d383e0-0c2c-44cf-9da1-0ce364b1dbdc/a_bag.jpg   86  

查询

 var query = (from c in cars
                         from ud in users_details
                         from bd in bids
                         orderby c.listingOption descending
                         where a.userID == ud.userid
                        && c.id == bd.carID
                        && c.enabled == true
                        && bd.userID == new Guid("0b3c2ba5-1538-4557-a6c0-7de701fd83e7")
                         let images = from ai in auction_images
                                      where ai.belongs_to == c.id
                                      select ai

                         let bid = (from b in bids
                                    orderby b.id descending
                                    where b.carID == c.id
                                    select b.bidamount).FirstOrDefault()
                         select
                         new
                         {
                             images,
                             bidamount = (bid != null ? bid : 0),
                             ud.city,
                             ud.state,
                             c.name,
                             c.descr,
                             c.id,
                             c.listingOption,
                             c.priceStarting,
                             c.priceReserve,
                             bd.userID
                         }
                         );

query.Distinct().Dump();

3
你从未投过任何选票。 - spender
3
@spender 但他必须首先获得超过15的声望...我同意他必须在之前的问题中选择一些答案。 - Destrictor
由于您在“汽车表”上有两个元素,因此您正在执行两次“select new {...}”操作。 - Tomas Ramirez Sarduy
“where a.userID == ud.userid” 这一行是否是打错了,因为 'a' 没有被定义为您的任何表之一,这将导致无法从 ud 关联到其他任何表? - James Ellis-Jones
@user389391,看我的帖子,它对你有效。我在你的帖子中发现了很多错误。其中一些是,在查询中你写了 "c.enabled",但 "cars" 表没有 "enabled" 字段,并且许多列名不匹配。请做得更好。谢谢。 - Prasad Kanaparthi
显示剩余2条评论
2个回答

0

这是一个非常大的家庭作业。请看下面,

使用这个查询语句,

            var query = from bd in lstbids
                    group bd by new { carid = bd.carid, userid = bd.userid } into gbd
                    join ud in lstuserdetails on gbd.First().userid equals ud.userid
                    join c in lstcars on gbd.First().carid equals c.id
                    where c.enabled && ud.userid == new Guid("0b3c2ba5-1538-4557-a6c0-7de701fd83e7")
                    select new
                    {
                        images = lstaction_images.Where(ai => ai.belongs_to == c.id),
                        bidamount = lstbids.Where(b => b.carid == c.id).OrderByDescending(b => b.id).Select(b => b.bidamount).DefaultIfEmpty(0).FirstOrDefault(),
                        ud.city,
                        ud.state,
                        c.name,
                        c.descr,
                        c.id,
                        c.listingOption,
                        c.priceStarting,
                        c.priceReserve,
                        gbd.FirstOrDefault().userid
                    };

注意:这个查询可以用更好的方式编写。

以下是示例表格(我将您的表格视为我的列表):

表格/类别

public class userdetails
{ 
    public Guid userid { get; set; }
    public string city { get; set; }
    public string state { get; set; }
}

public class bids
{
    public int id { get; set; }
    public int carid { get; set; }
    public int bidamount { get; set; }
    public DateTime dateplaced { get; set; }
    public Guid userid { get; set; }
}

public class  cars
{
    public int id { get; set; }
    public string name { get; set; }
    public string descr { get; set; }
    public int listingOption { get; set; }
    public int priceStarting { get; set; }
    public int priceReserve { get; set; }
    public bool enabled { get; set; }
}

public class action_images
{
    public int id { get; set; }
    public string image { get; set; }
    public int belongs_to { get; set; }
}

数据/记录

        List<bids> lstbids = new List<bids>
        { 
            new bids {id= 43, carid=83, bidamount=625, dateplaced=Convert.ToDateTime("2012-11-05 16:12:51.600"), userid=new Guid("a5d383e0-0c2c-44cf-9da1-0ce364b1dbdc") }, 
            new bids {id= 44, carid=86, bidamount=575, dateplaced=Convert.ToDateTime("2012-11-05 16:15:02.257"), userid=new Guid("a5d383e0-0c2c-44cf-9da1-0ce364b1dbdc")  },
            new bids {id= 45, carid=83, bidamount=650, dateplaced=Convert.ToDateTime("2012-11-05 16:15:07.283"), userid=new Guid("a5d383e0-0c2c-44cf-9da1-0ce364b1dbdc")  },
            new bids {id= 46, carid=86, bidamount=600, dateplaced=Convert.ToDateTime("2012-11-05 17:45:04.140"), userid=new Guid("a5d383e0-0c2c-44cf-9da1-0ce364b1dbdc")  },
            new bids {id= 47, carid=86, bidamount=625, dateplaced=Convert.ToDateTime("2012-11-05 17:45:08.867"), userid=new Guid("a5d383e0-0c2c-44cf-9da1-0ce364b1dbdc")  },
            new bids {id= 49, carid=83, bidamount=750, dateplaced=Convert.ToDateTime("2012-11-07 13:40:37.590"), userid=new Guid("0b3c2ba5-1538-4557-a6c0-7de701fd83e7")  },
            new bids {id= 52, carid=83, bidamount=850, dateplaced=Convert.ToDateTime("2012-11-08 13:40:37.590"), userid=new Guid("0b3c2ba5-1538-4557-a6c0-7de701fd83e7") },
        };

        List<userdetails> lstuserdetails = new List<userdetails>
        {
            new userdetails { userid = new Guid ("0b3c2ba5-1538-4557-a6c0-7de701fd83e7"), city = "Sydney", state = "NSW"},
        };

        List<cars> lstcars = new List<cars>
        {
            new cars {id = 83, name = "Valiant", descr = "Old Car", listingOption = 2, priceStarting = 1000, priceReserve = 1500, enabled = true },
            new cars {id = 86, name = "Volvo", descr = "Safe Car", listingOption = 3, priceStarting = 3000, priceReserve = 4500, enabled = true },
        };

        List<action_images> lstaction_images = new List<action_images>
        {
            new action_images { id = 71 , image = "images/a5d383e0-0c2c-44cf-9da1-0ce364b1dbdc/alpaca.JPG", belongs_to =83 },
            new action_images { id = 72 , image = "images/a5d383e0-0c2c-44cf-9da1-0ce364b1dbdc/a_bag.jpg", belongs_to =83 },
            new action_images { id = 75 , image = "images/a5d383e0-0c2c-44cf-9da1-0ce364b1dbdc/alpaca.JPG", belongs_to =86 },
            new action_images { id = 76 , image = "images/a5d383e0-0c2c-44cf-9da1-0ce364b1dbdc/a_bag.jpg", belongs_to =86 },
        };

@user389391 请尝试这个查询...它适用于您。请告诉我结果。 - Prasad Kanaparthi
非常感谢您对此问题的有趣尝试,但是结果返回了用户“0b3c2ba5-1538-4557-a6c0-7de701fd83e7”的两个唯一竞标,而根据数据,他们应该只有一个唯一竞标。 - user389391
好的,忽略我之前的评论,进一步测试发现你可能已经解决了问题,但是出现了一个错误:不支持使用查询运算符“DefaultIfEmpty”的重载。如果我将其删除,似乎可以工作。继续测试并更新您。 - user389391

0
我正在寻找用户详细信息+汽车详细信息+用户图像: 0b3c2ba5-1538-4557-a6c0-7de701fd83e7
根据您在该行中所说的,您可以通过将查询拆分为3个单独的查询,并对汽车ID使用Distinct函数来实现您的目标。
具体操作如下:
1. 从当前用户的出价表中查找所有不同的汽车ID 2. 查找与步骤1中的数据相对应的所有图像(以及用户/汽车详细信息)
代码应该是这样的:
var carIDs = bids.Where(x=>x.usedid == new Guid("0b3c2ba5-1538-4557-a6c0-7de701fd83e7")).Select(x=>x.cardid).Distinct();
然后,您可以选择用户详细信息和图像(分别进行两个查询)。

谢谢,如果Prasad的解决方案不起作用,我会尝试您的方法。不过我先看到了他的解决方案并尝试了它,因为它在顶部并且更符合我想要的一次性查询 :-) - user389391

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接