如何让Linq只返回一次相同的重复行

本文关键字:一次 Linq 返回 | 更新日期: 2023-09-27 17:58:01

我对此还很陌生,所以请放心。当查询返回多个相同的记录时,我正试图让linq返回单个记录。这是我的:

var query = (from i in _db.BizListView
            let dist = DbGeography.FromText(i.Point).Distance(DbGeography.FromText(geog)) * .0006214
            where
                dist <= rng &&
                i.Name.Contains(key) &&
                pri != -1 ? (i.BizCategoryID == pri && i.Primary == true) : true &&
                biz != -1 ? (i.BizCategoryID == biz) : true  
            group i by new
            {
                ClientID = i.ClientID,
                Name = i.Name,
                Address = i.Address,
                Address1 = i.City + ", " + i.StateID + " " + i.PostCode,
                BizPhone = i.BizPhone,
                EmailAddress = i.EmailAddress,
                ClientImagePath = i.ClientImagePath,
                Distance = DbGeography.FromText(i.Point).Distance(DbGeography.FromText(geog)) * 0.0006214
            }
            into myTable                                                  
            orderby myTable.Key.Distance ascending
            select new 
            {
                ClientID = myTable.Key.ClientID,
                Name = myTable.Key.Name,
                Address = myTable.Key.Address,
                Address1 = myTable.Key.Address1,
                BizPhone = myTable.Key.BizPhone,
                EmailAddress = myTable.Key.EmailAddress,
                ClientImagePath = myTable.Key.ClientImagePath,
                Distance = myTable.Key.Distance                            
            }).Distinct();
return query;

只要指定了BizCategory,查询就会为每个客户端生成一条记录,但如果未指定BizCategories,则会为每个客户端返回多条相同的记录(每个客户端的BizCategorys都有一条记录)。在未指定BizCategory的情况下,如何让查询为每个客户端返回一条记录,而不是多条相同的记录?

如何让Linq只返回一次相同的重复行

我认为运算符优先级正在影响查询。

尝试在三元运算符周围添加括号。

(pri != -1 ? (i.BizCategoryID == pri && i.Primary == true) : true) &&
(biz != -1 ? (i.BizCategoryID == biz) : true)

表达这种情况的一种更简单的方法可能是:

(pri == -1 || i.BizCategoryID == pri) &&
(biz == -1 || i.BizCategoryID == biz)

的解释方式

pri != -1 
    ? (i.BizCategoryID == pri && i.Primary == true)
    : (true && (biz != -1 ? (i.BizCategoryID == biz) : true))
            |< ----- IGNORED ----------------------------->|

您可以看到true && biz != -1...在此处具有优先权。由于首先评估true,因此从未评估biz

Gah!!我所要做的就是添加一个附加条件!

var query = from i in _db.BizListView
            let dist = DbGeography.FromText(i.Point).Distance(DbGeography.FromText(geog)) * 0.0006214
            where
                dist <= rng &&
                i.Name.Contains(key) &&
                pri != -1 ? (i.BizCategoryID == pri && i.Primary == true) : true &&
                biz != -1 ? (i.BizCategoryID == biz) : true &&
                (biz == -1 && pri == -1) ? (i.Primary == true): true               
            orderby i.Distance ascending
            select i;

哦,好吧。生活和学习。