在C#中使用LINQ.Select时如何维护类型?
我试图返回一组不同的结果,这些结果首先使用Substring进行修剪,但当我调用“Select”时,它会将其转换为匿名类型。我似乎无法用这个来维护“列表”类型。我只需要返回Select方法中指定的字段在C#中使用LINQ.Select时如何维护类型?,c#,linq,C#,Linq,我试图返回一组不同的结果,这些结果首先使用Substring进行修剪,但当我调用“Select”时,它会将其转换为匿名类型。我似乎无法用这个来维护“列表”类型。我只需要返回Select方法中指定的字段 public List<Facility> GetFacilities() { var facilities = new List<Facility>(); facilities = _facilityRepository.GetAll().ToList(
public List<Facility> GetFacilities() {
var facilities = new List<Facility>();
facilities = _facilityRepository.GetAll().ToList();
var facReturnList =
facilities.Where(x => x.Fac_Name = "Something")
.OrderBy(x => x.Fac_Name).ToList();
var facReturnList2 =
facReturnList.Select(x =>
new { ID = x.Fac_Name.Substring(0, 6),
Fac_Name = x.Fac_Name.Substring(0, 3) })
.Distinct().ToList();
return facReturnList2;
}
public List GetFacilities(){
var facilities=新列表();
设施=_facilityRepository.GetAll().ToList();
var facReturnList=
设施。其中(x=>x.Fac_Name=“某物”)
.OrderBy(x=>x.Fac_Name).ToList();
var facReturnList2=
facReturnList。选择(x=>
新的{ID=x.Fac_Name.Substring(0,6),
Fac_Name=x.Fac_Name.Substring(0,3)})
.Distinct().ToList();
返回列表2;
}
我尝试在
new
之后添加List
,但是它说那些属性(ID
和Fac\u Name
)没有在Facility中定义。您得到的是匿名类型,因为您正在创建它
.Select(x => new {
如果你不想那样做,就不要那样做
如果现有类型已具有所需的名称和精确属性,请使用该类型。如果没有一个类型符合您的需要,请创建一个。然后,您可以返回该类型的适当列表或枚举
.Select(x => new YourDefinedType {
您获得的是匿名类型,因为您正在创建它
.Select(x => new {
如果你不想那样做,就不要那样做
如果现有类型已具有所需的名称和精确属性,请使用该类型。如果没有一个类型符合您的需要,请创建一个。然后,您可以返回该类型的适当列表或枚举
.Select(x => new YourDefinedType {
是否要使用结果初始化新的
设施
实例
var facReturnList2 = facReturnList.Select(x => new Facility { ID = // ...
^ concrete type initializer
编辑响应:在
选择
操作符中,您需要指定要初始化的元素的类型,而不是它们的列表。您以前的代码似乎表明,Fac\u Name
是在Facility
中定义的,但它显然不会在列表中定义您想用结果初始化新的Facility
实例吗
var facReturnList2 = facReturnList.Select(x => new Facility { ID = // ...
^ concrete type initializer
编辑响应:在选择
操作符中,您需要指定要初始化的元素的类型,而不是它们的列表。您以前的代码似乎表明Fac\u Name
是在设施中定义的,但它显然不会在列表中定义以下代码指示linq返回匿名类型:
.Select(x => new { ID = x.Fac_Name.Substring(0, 6), Fac_Name = x.Fac_Name.Substring(0, 3) }
您需要为结果创建一个类
public class Result{
public string ID { get;set; }
public string Fac_Name { get; set; }
}
//Then do
.Select(x => new Result { ID = x.Fac_Name.Substring(0, 6), Fac_Name = x.Fac_Name.Substring(0, 3) }
这确保您只返回所需的信息以下代码指示linq返回匿名类型:
.Select(x => new { ID = x.Fac_Name.Substring(0, 6), Fac_Name = x.Fac_Name.Substring(0, 3) }
您需要为结果创建一个类
public class Result{
public string ID { get;set; }
public string Fac_Name { get; set; }
}
//Then do
.Select(x => new Result { ID = x.Fac_Name.Substring(0, 6), Fac_Name = x.Fac_Name.Substring(0, 3) }
这确保您只返回所需的信息听起来您真正想要的是一种通过
方法进行区分的方法。您希望指定某种方法来指示对象是不同的,但不希望结果是该选择的集合,而是希望最终结果是起始对象。LINQ没有内置的区别,但实现一个非常简单:
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer = null)
{
comparer = comparer ?? EqualityComparer<TKey>.Default;
HashSet<TKey> knownKeys = new HashSet<TKey>(comparer);
foreach (TSource element in source)
{
if (knownKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
听起来你真正想要的是一种
方法。您希望指定某种方法来指示对象是不同的,但不希望结果是该选择的集合,而是希望最终结果是起始对象。LINQ没有内置的区别,但实现一个非常简单:
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer = null)
{
comparer = comparer ?? EqualityComparer<TKey>.Default;
HashSet<TKey> knownKeys = new HashSet<TKey>(comparer);
foreach (TSource element in source)
{
if (knownKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
这就是我错过的。我只需要把它当作一个设施,而不是一个列表。谢谢您需要将其构建为一个工具,而不是castit@fguchelaar,我觉得这个术语不正确。我一定会查的。@JamesRLamar:他们被叫来了。您可以按照前面的链接访问他们的MSDN文章。这就是我所缺少的。我只需要把它当作一个设施,而不是一个列表。谢谢您需要将其构建为一个工具,而不是castit@fguchelaar,我觉得这个术语不正确。我一定会查的。@JamesRLamar:他们被叫来了。您可以按照前面的链接访问他们的MSDN文章。您最好使用Facility的模型,而不是返回实体本身。此外,您通常可以通过在查询之间不使用.ToList()
来减少查询。前两个linq查询可能不需要调用ToList
,除非您使用的distinct不能转换为sql。(顺便说一句,我们谈论的是datacontext吗?@Silvermind,我认为您在这两个方面都是对的,但我对这项技术都是新手,因此我不能肯定这是一个“datacontext”,您可能会更好地使用设施模型,而不是返回实体本身。此外,您通常可以通过在查询之间不使用.ToList()
来减少查询。前两个linq查询可能不需要调用ToList
,除非您使用的distinct不能转换为sql。(我们是在谈论datacontext吗?@Silvermind,我想你在这两个方面都是对的,但我对这项技术都是新手,因此我不能肯定这是一个“datacontext”,我还没有得到明确的结果,使用你的代码“DistinctBy”不是公认的扩展方法。我将在这里创建另一个关于此问题的问题。我认为你的答案和这一条可能是正确的,@JamesRLamar我在这篇文章中提供了扩展方法的定义。正如我所说,它不存在于林克本身。我明白了。我按照你的建议为它添加了静态类。在后台,我会做一些其他事情来获取存储库,所以我猜这就是冲突所在。我非常感谢您的帮助。我仍然没有得到明确的结果,使用您的代码“DistinctBy”不是公认的扩展方法。我将在这里创建另一个关于此问题的问题。我想你的答案和这一个