C# 我在复杂的lambda查询中使用Distinct,但不起作用
我想从两个没有任何关系的表中搜索 这些是我的桌子C# 我在复杂的lambda查询中使用Distinct,但不起作用,c#,linq,asp.net-core,entity-framework-core,razor-pages,C#,Linq,Asp.net Core,Entity Framework Core,Razor Pages,我想从两个没有任何关系的表中搜索 这些是我的桌子 public class News { public int Id { get; set; } public string Title { get; set; } public string FullText { get; set; } } public class SubFolder { public int Id { get; s
public class News
{
public int Id { get; set; }
public string Title { get; set; }
public string FullText { get; set; }
}
public class SubFolder
{
public int Id { get; set; }
public string Title { get; set; }
public string Text { get; set; }
}
为此,我创建了一个ViewModel,并实现了IEquatable
公共类SearchViewModels:IEquatable
{
public int NewsId{get;set;}
公共字符串NewsText{get;set;}
公共字符串NewsTitle{get;set;}
public int SubId{get;set;}
公共字符串子文件夹text{get;set;}
公共字符串子文件夹标题{get;set;}
公共布尔等于([AllowFull]SearchViewModels其他)
{
//检查比较对象是否为空。
if(Object.ReferenceEquals(other,null))返回false;
//检查比较对象是否引用相同的数据。
if(Object.ReferenceEquals(this,other))返回true;
返回newsttitle.Equals(其他.newsttitle)和
NewsId.Equals(其他.NewsId)&&
NewsText.Equals(其他.NewsText)&&
子文件夹标题.Equals(其他.SubFolderTitle)&&
子文件夹文本.Equals(其他.SubFolderText)&&
SubId.Equals(其他SubId);
}
公共覆盖int GetHashCode()
{
int hashNewsText=NewsText==null?0:NewsText.GetHashCode();
int hashNewsID=NewsId==null?0:NewsId.GetHashCode();
int-hashNewsTitle=NewsTitle==null?0:NewsTitle.GetHashCode();
int hashSubTitle=SubFolderTitle==null?0:SubFolderTitle.GetHashCode();
int hashSubText=SubFolderText==null?0:SubFolderText.GetHashCode();
int hashSubId=SubId==null?0:SubId.GetHashCode();
返回hashNewsText^hashNewsID^hashNewsTitle^hashSubId^hashSubText^hashSubTitle;
}
}
我的lambda搜索查询在razor页面中:
[BindProperty]
public IEnumerable<Model.SearchViewModels> SearchViewModels { get; set; }
public void OnGet(string searchParam)
{
SearchViewModels = _context.News.SelectMany(a => _context.SubFolders, (a, b) => new {a,b})
.Where (x=>x.a.FullText.Contains( searchParam) && x.a.Active && x.b.Text.Contains( searchParam) && x.b.Publish)
.Select(x =>new SearchViewModels{
NewsText = x.a.FullText,NewsId = x.a.Id,NewsTitle = x.a.Title, SubFolderText= x.b.Text,SubId =x.b.Id, SubFolderTitle= x.b.Title})
.Distinct().ToList();
}
}
[BindProperty]
公共IEnumerable SearchViewModels{get;set;}
public void OnGet(字符串searchParam)
{
SearchViewModels=\u context.News.SelectMany(a=>\u context.SubFolders,(a,b)=>new{a,b})
其中(x=>x.a.FullText.Contains(searchParam)&&x.a.Active&&x.b.Text.Contains(searchParam)&&x.b.Publish)
.选择(x=>new SearchViewModels{
NewsText=x.a.FullText,NewsId=x.a.Id,NewsTitle=x.a.Title,子文件夹Text=x.b.Text,SubId=x.b.Id,子文件夹Title=x.b.Title})
.Distinct().ToList();
}
}
鉴于此,请这样写
@foreach (var item in Model.SearchViewModels)
{
<div class="btn btn-primary" >@nne</div>
@* @item.NewsId *@ <br>
<a href="#">@item.NewsTitle</a>
@* @Html.Raw(item.NewsText) *@
@* @item.SubId *@<br>
<a href="#">@item.SubFolderTitle</a>
@* @Html.Raw(item.SubFolderText) *@
<hr>
nne++;
}
@foreach(Model.SearchViewModels中的变量项)
{
@nne
@*@item.NewsId*@
@*@Html.Raw(item.NewsText)*@
@*@item.SubId*@
@*@Html.Raw(item.SubFolderText)*@
nne++;
}
我有数据,但像这样
@foreach (var item in Model.SearchViewModels)
{
<div class="btn btn-primary" >@nne</div>
@* @item.NewsId *@ <br>
<a href="#">@item.NewsTitle</a>
@* @Html.Raw(item.NewsText) *@
@* @item.SubId *@<br>
<a href="#">@item.SubFolderTitle</a>
@* @Html.Raw(item.SubFolderText) *@
<hr>
nne++;
}
“新闻文本_1”
“子文件夹文本_1”
“新闻文本_1”
“子文件夹文本_2”
“新闻文本2”
“子文件夹文本_1”
“新闻文本2”
“子文件夹文本_1”
我怎么会有这种感觉
@foreach (var item in Model.SearchViewModels)
{
<div class="btn btn-primary" >@nne</div>
@* @item.NewsId *@ <br>
<a href="#">@item.NewsTitle</a>
@* @Html.Raw(item.NewsText) *@
@* @item.SubId *@<br>
<a href="#">@item.SubFolderTitle</a>
@* @Html.Raw(item.SubFolderText) *@
<hr>
nne++;
}
“新闻文本_1”
“新闻文本2”
“子文件夹文本_1”
“子文件夹文本_2”
“newsText_1”“newsText_2”
“子文件夹文本_1”“子文件夹文本_2”
为了获得预期结果,您可以更改视图,如下所示:
<table class="table">
<thead>
<tr>
<th></th>
</tr>
</thead>
<tbody>
<tr>
@foreach (var item in Model.SearchViewModels.Select(s => new { s.NewsTitle }).Distinct())
{
<td>
<a href="#">@item.NewsTitle</a>
</td>
}
</tr>
<tr>
@foreach (var item in Model.SearchViewModels.Select(s => new { s.SubFolderTitle }).Distinct())
{
<td>
<a href="#">@item.SubFolderTitle</a>
</td>
}
</tr>
</tbody>
</table>
@foreach(Model.SearchViewModels.Select(s=>new{s.newsttitle}).Distinct()中的var项)
{
}
@foreach(Model.SearchViewModels.Select(s=>new{s.SubFolderTitle}).Distinct()中的var项)
{
}