结合使用LINQ和Select和Distinct方法

时间:2019-05-21 11:25:56

标签: c# asp.net linq

如果我在LINQPad中使用以下代码查询数据库,则会得到所需的结果:

LoadTables.Where(o=> o.Approver== "Name Name" ||o.Approver== "Name.Name").Select(o=>o.SubmittedBy).ToList().Distinct()

但是,如果我对此进行修改并将其放入代码中,则会收到错误消息:

public IEnumerable<LoadTable> TableList;
TableList = _context.LoadTable.Where(o => o.Approver == GetADDetails.displayName || o.Approver == GetADDetails.userName).Select(o => o.SubmittedBy).ToList().Distinct();

返回的错误是:

无法隐式转换类型'System.Collections.Generic.IEnumerable<string>' to 'System.Collections.Generic.IEnumerable<App.Models.LoadTable>' An explicit conversion exists.

我要去哪里错了?

有关上下文,请参阅前面的问题:

Using LINQ to loop through data and display in a table

当前,它为每个匹配都重新创建一个新表,我正在尝试让它为每个用户返回一个表。

3 个答案:

答案 0 :(得分:0)

从Linq表达式{{ form_start(form) }} <div class="my-custom-class-for-errors"> {{ form_errors(form) }} </div> <div id="alphaTitle"> {{ form_row(form.alphaTitle) }} </div> {% if form.AlphaBetas %} <b>Betas</b> </br></br> {% for Beta in form.AlphaBetas %} {% for BetaField in Beta %} {{ form_row(BetaField) }} {% endfor %} {% endfor %} {% endif %} <div id="AlphaBeta-fields-list" data-prototype="{{ form_widget(form.AlphaBetas.vars.prototype)|e }}" data-widget-tags="{{ '<p></p>' |e }}" data-widget-counter="{{ form.children|length }}"> {% for AlphaBetaField in form.AlphaBetas.vars.prototype.children %} {{ form_row(AlphaBetaField) }} {% endfor %} </div> <button type="button" id="add-another-collection-widget" data-list-selector="#AlphaBeta-fields-list">Insert Beta</button> </br> <button class="btn">{{ button_label|default('Save') }}</button> {{ form_end(form) }} 中删除,并将Select(o => o.SubmittedBy)放在Distinct()的前面:

ToList()

答案 1 :(得分:0)

您正在选择字符串属性

**.Select(o => o.SubmittedBy)**

此返回IEnumerable<string>

您需要以下类似内容

_context.LoadTable.Where(o => o.Approver == GetADDetails.displayName || o.Approver == GetADDetails.userName).Distinct().GroupBy(p => p.SubmittedBy).Select(grp => grp.FirstOrDefault());

答案 2 :(得分:0)

las,您忘了告诉我们_context.LoadTable返回的序列中包含哪些对象。查看您的代码,似乎它返回了一个可枚举的对象序列,其中每个对象至少具有一个属性SubmittedBy

看着您的错误,看来SubmittedBy是一个字符串属性。

如果将代码分成较小的部分并使用适当的标识符,您很快就会发现问题所在。

让我们检查一下您的代码:

IEnumerable<LoadTable> TableList = _context.LoadTable
    .Where(o => o.Approver == GetADDetails.displayName || o.Approver == GetADDetails.userName)
    .Select(o => o.SubmittedBy)
    .ToList()
    .Distinct();

_context.LoadTable返回一个我不知道的IEnumerable序列,所以我们假设它是Notes的序列:

IEnumerable<Note> notes = _context.LoadTable;

可能是LoadTable返回了IEnumerable而不是IEnumerabl<Note>,在这种情况下,您应该转换已加载的表。

下一条语句:

IEnumerableM<Note> notesApprovedByUser = notes
    .Where(note => note.Approver == GetADDetails.displayName 
                || note.Approver == GetADDetails.userName);
IEnumerable<string> submitters = notesApprovedByUser
    .Select(note => note.SubmittedBy);
List<string> submitterList = submitters.ToList();
IEnumerable<string> distinctSubmitters = submitterList.Distinct();

很容易看出,不能轻易将字符串序列转换为LoadTables序列。

问题是:您想要唯一的LoadTables,还是要为每个提交者所有历史提交的笔记?在这种情况下,您将不得不Groupby而不是Select

.Where(note => ...)
.GroupBy(note => note.SubmittedBy,  // make groups of Notes submitted by the same submitter
   // parameter resultSelector: take every submitter and all notes that
   // were submitted by this submitter to make a new object
   (submittedBy, notesSubmittedByThisSubmitter) => new
   {
       // select the properties you plan to use
       Submitter = submittedBy
       LoadTables = notesSubmittedByThisSubmitter.Select(note => new LoadTable
       {
           ... again: select the properties you need
       })
       .ToList(),
   });
  

记住:保留一个IEnumerable<...>和一个IEnumerable<...> as long as possible. If not necessary, don't do a ToList()before you return. If your query returns 1000 items, and your caller will only do FirstOrDefault , or Take(3).ToList()`,这会浪费处理能力创建您的完整列表