使用Linq选择不同的行

时间:2015-05-31 01:15:24

标签: c# sql linq

数据如下

ID Title        Category About           Link        CategoryID
1  The Matrix   Sci-Fi   Text goes here  http://...  1 
2  The Simpsons Cartoon  Text goes here  http://...  2
3  Avengers     Action   Text goes here  http://...  3
4  The Matrix   Sci-Fi   Text goes here  http://...  1
5  The One      Sci-Fi   Text goes here  http://...  1
6  The Hobbit   Sci-Fi   Text goes here  http://...  1

我有一个包含类别的复选框列表。问题是如果用户选择' Action'和科幻'科幻'作为显示的类别矩阵将显示两次。

这是我在SQL Query中获取唯一行的尝试。

select distinct title, about, link from mytable
inner join tableCategories on categoryID = tableCategoriesID
group by title, about, link

使用LINQ,

(from table in movieTables
join x in categoryIDList
on categoryID equals x
slect table).Distinct()

请注意,类别位于由categoryID链接的单独表中。 需要帮助在LINQ中显示唯一或不同的行。

1 个答案:

答案 0 :(得分:0)

您可以愉快地将结果选择到您想要的任何列表中:

var v = from entry in tables
        where matching_logic_here
        select new {id = some_id, val=some_value};

然后您可以根据自己的需要在该列表中运行您的不同内容(好吧,上面的ToList()会使其成为一个)。

以下内容应说明我的意思(只需粘贴到linqpad。如果你使用的是VS,请摆脱.Dump()

void Main()
{
    var input  = new List<mock_entry> {
        new mock_entry {id = 1, name="The Matrix", cat= "Sci-Fi"},
        new mock_entry {id = 2, name="The Simpsons" ,cat= "Cartoon"},
        new mock_entry {id = 3, name="Avengers" ,cat= "Action"},
        new mock_entry {id = 4, name="The Matrix", cat= "Sci-Fi"},
        new mock_entry {id = 5, name="The One" ,cat= "Sci-Fi"},
        new mock_entry {id = 6, name="The Hobbit",cat= "Sci-Fi"},
    };

    var v = input.Where(e=>e.cat == "Action" || e.cat =="Sci-Fi")
                .Dump()
                .Select(e => new {n = e.name, c =e.cat})
                .Dump()
    ;

    var d = v.Distinct()
            .Dump()
    ;
}

// Define other methods and classes here
public struct mock_entry {
    public int id {get;set;}
    public string name {get;set;}
    public string cat {get;set;}
}

另一种选择是使用this question

中建议的 more linq 中的DistinctBy

修改

更简单的是,您可以使用GroupBy,只需选择第一个条目(但您会丢失ID,但由您决定)。
以下是一个适用于上述内容的示例:

var v = input.GroupBy (i => i.name)
   .Select(e => e.First ())
   .Dump()
   .Where(e=>e.cat == "Action" || e.cat =="Sci-Fi")
   .Dump()
;    

将产生:

  

1 Matrix Sci-Fi
  3复仇者行动
  5 The One Sci-Fi
  6霍比特人科幻小说