0

我想将相同SELECT的应用程序应用于一定数量的queries,我该怎么做?我正在寻找某种我猜的模板?

var query = (from b in db.routes select new 
{ name = b.name,
age = b.age});

我想预定义 name=b.name 和 age = b.age。

谢谢

4

3 回答 3

2

您可以创建带有IEnumerable<SomeBaseClassOrInterfacee>参数的方法。然后您可以针对方法中的给定参数进行选择。

public class Generic
{
    protected Generic(string name, int age)
    {
        Name = name;
        Age = age;
    }

    public string Name { get; private set; }
    public int Age { get; private set; }
}

public class Human : Generic 
{
    public Human(string name, string surname, int age) : base(name, age)
    {
        Surname = surname;
    }

    public string Surname { get; private set; }
}

public class Pet : Generic
{
    public Pet(string name, int registrationCode, int age)
        : base(name, age)
    {
        RegistrationCode = registrationCode;
    }

    public int RegistrationCode { get; private set; }
}


static void Main(string[] args)
{
    IEnumerable<Pet> pets = new List<Pet>();
    IEnumerable<Human> palls = new List<Human>();

    var resPets = SelectAgeGreaterThen10<Pet>(from p in pets where p.Name.StartsWith("A") select p);
    var resHumans = SelectAgeGreaterThen10<Human>(from p in palls where p.Name.StartsWith("B") select p);

}

private static IEnumerable<T> SelectAgeGreaterThen10<T>(IEnumerable<Generic> source) where T : Generic
{
    return from s in source where s.Age > 10 select (T)s;
}
于 2013-03-13T14:36:00.663 回答
1

您的示例的棘手之处在于您使用的是匿名类型 - 这意味着您无法编写方法(您无法声明返回类型)并且您无法将 lambda 表达式分配给局部变量(您需要能够指定将 lambda 表达式转换为的类型)。

不能只使用类型推断从泛型方法返回某些内容 - 因为您无法仅指定输入类型。但是,您可以对泛型类使用类型推断:

public static class Functions<T>
{
    public static Func<T, TResult> Create<TResult>(Func<T, TResult> func)
    {
        return func;
    }
}

然后你可以写:

var projection = Functions<Route>.Create(r => new { r.name, r.age });

var query = db.routes
              .Select(projection)
              ...;

但是如果你真的想在多个地方使用相同的投影,你应该考虑创建一个命名的结果类型——此时你可以使用任何其他选项,包括转换方法。

于 2013-03-13T14:41:43.607 回答
0

这个样子怎么样:

class NameAndAge
{
    public String Name;
    public Int32 Age;
}

class Whatever
{
    public IEnumerable<NameAndAge> GetNameAndAges(IEnumerable<dynamic> enumerable)
    {
         return from b in enumerable select new NameAndAge { Name = b.name,
                                                             Age = b.age};
    } 
}

您可能希望用dynamic其中元素的类型替换参数类型db.routes

于 2013-03-13T14:51:18.987 回答