C# - IQueryable查询如何选择?

28 浏览
0 Comments

C# - IQueryable查询如何选择?

在这个查询中,我得到了6列,但我只需要其中的3列,我该如何使用select方法只获取我需要的那些列?

是否是像这样:

.Select(t => t.FirstName, u => u.Name, i => i.NameCode);

在SQL中,我真正想要的是不是"select *",而是"select NameCode, Name, FirstName",但我需要它作为IQueryable。

0
0 Comments

问题的原因是在查询中选择特定的列时,需要将结果投影到具有这些属性的对象中。解决方法是使用匿名对象或自定义对象进行投影。

以下是解决方法的示例代码:

// 使用匿名对象进行投影
var result = entities.ImportNameValidation
    .Where(y => y.FirstName == searchedName && y.NameType == comboValue)
    .Select(t => new { t.FirstName, t.Name, t.NameCode })
    .ToList();
// 使用自定义DTO对象进行投影
public class ImportNameValidationDTO
{
    public string FirstName { get; set; }
    public string Name { get; set; }
    public string NameCode { get; set; }
}
List result = entities.ImportNameValidation
    .Where(y => y.FirstName == searchedName && y.NameType == comboValue)
    .Select(t => new ImportNameValidationDTO { FirstName = t.FirstName, Name = t.Name, NameCode = t.NameCode })
    .ToList();

如果你尝试将查询结果直接赋值给不同类型的集合(例如`List`),会出现编译错误。这是因为查询结果的类型已经不再是`ImportNameValidation`,所以需要将结果投影到自定义的DTO对象中。

在解决问题时,你可能会遇到以下错误:

- 无法将类型`System.Linq.IQueryable<>`隐式转换为`System.Linq.IQueryable`。请参考上面的解决方法。

- 找不到类型或命名空间名为`ImportNameValidationDTO`,请确认是否缺少引用或命名空间。

解决这些错误的方法是创建`ImportNameValidationDTO`类,并将查询结果投影到该类的对象中。

此外,文章中还提到了一种解决方法的替代方案,即隐藏不需要的列。这种方法通过设置`dataGridView_Result.Columns["NameNo"].Visible = false`来隐藏列。然而,这只是一种权宜之计,不如使用正确的解决方法简单和可靠。

最后,文章中的某人评论说,不是每个人都具有相同的编程技能,有些事情并不总是显而易见。但是,值得一提的是,解决问题时应该付出一些努力,而不是只采取权宜之计。

0
0 Comments

C#中的IQueryable查询如何进行选择?

在这个问题中,出现了一个原因是需要将查询结果转换成相同对象类型的列表。解决方法是首先将数据作为可枚举类型获取。

List ResultValues = query.AsEnumerable().Select(t => new ImportNameValidation { t.FirstName, t.Name, t.NameCode });

在这里并不需要使用AsEnumerable。

如果需要在域实体中投影数据,则需要将其作为可枚举类型。这就是这个问题的情况。

使用AsEnumerable将导致整个查询被拉入内存,并且消除了仅选择字段子集的好处。

是的,但是不添加AsEnumerable将不允许生成列表,因为存在域模型的问题。所以,要么使用ViewModel,要么需要先提取数据。如果我理解错了,请告诉我。

我不明白为什么域模型会阻止完成这个查询。另外,我没有给这个问题投票,我认为这应该可以正常工作(不使用AsEnumerable)。例如,可以在这里查看:dotnetfiddle.net/KdrqtJ。这应该可以正常工作。

不是说你的问题有什么问题:)。我指的是这个问题:stackoverflow.com/questions/5325797/…

嗯,我没有我的环境来测试,但我认为如果你在Select中显式传递类型,比如`.Select(t => new ImportNameValidation() { ... } )`,它可能会起作用。

0
0 Comments

C# - IQueryable query how to select?

在C#中,当使用IQueryable查询时,如何进行选择?

问题的原因是,当使用IQueryable进行查询时,我们需要选择特定的属性或字段。在给定的示例中,通过使用匿名类型来选择查询结果中的特定属性,如FirstName、Name和NameCode。但是需要注意的是,使用匿名类型进行选择后,结果的类型将不再是ImportNameValidation类型。

解决方法是使用Select方法以及匿名类型来选择查询结果中的特定属性。通过在Select方法中传递一个lambda表达式,我们可以创建一个新的匿名类型对象,该对象具有我们想要选择的属性。在给定的示例中,使用Select方法选择了FirstName、Name和NameCode属性,并使用匿名类型来创建新的对象。

代码示例:

.Select(t => new { t.FirstName, t.Name, t.NameCode})

通过这种方式,我们可以选择查询结果中的特定属性,并且结果的类型将是一个匿名类型对象。这种方法可以在使用IQueryable进行查询时非常有用,因为它允许我们灵活地选择我们需要的属性,而不必返回整个对象。

0