在C#中使用LINQ.Select时如何维护类型?

在C#中使用LINQ.Select时如何维护类型?,c#,linq,C#,Linq,我试图返回一组不同的结果,这些结果首先使用Substring进行修剪,但当我调用“Select”时,它会将其转换为匿名类型。我似乎无法用这个来维护“列表”类型。我只需要返回Select方法中指定的字段 public List<Facility> GetFacilities() { var facilities = new List<Facility>(); facilities = _facilityRepository.GetAll().ToList(

我试图返回一组不同的结果,这些结果首先使用Substring进行修剪,但当我调用“Select”时,它会将其转换为匿名类型。我似乎无法用这个来维护“列表”类型。我只需要返回Select方法中指定的字段

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”不是公认的扩展方法。我将在这里创建另一个关于此问题的问题。我想你的答案和这一个