Zu allererst eine neue IQueryable aus einem Array nicht schaffen kann dies dort zu ziehen alles im Speicher und Filter zufällt. Sie arbeiten mit Ausdrücken und nicht mit C# -Code, wenn Sie LINQ mit SQL ausführen, dies funktioniert nur im Speicher (IEnumerable). Ihre Anfrage wird in SQL arbeiten, wenn Sie es wie diese, dass die Art der IQueryable Gegeben
from element in MyPredicateContext
where ids.Contains(element.Id)
select new Element
{
Id = element.Id,
Description = element.JobDescription,
}
tun, wo T eine Schnittstelle oder Klasse. Das Ende Methode so etwas wie dieses
public interface IElement
{
Guid Id { get; }
string JobDescription { get; }
}
public Element[] GetByIds<T>(IQueryable<T> myPredicateContext, Guid[] ids) where T:IElement
{
return (from element in myPredicateContext
where ids.Contains(element.Id)
select new Element
{
Id = element.Id,
Description = element.JobDescription,
}).ToArray();
}
aussehen Es gibt Möglichkeiten, es ohne Generics zu tun, aber sie sind ein wenig weiter fortgeschritten und wird beibehalten hart.
Hier ist eine Methode, die auf allen T-Typen funktioniert und richtige IQueryable wird gute SQL produzieren, gerade wie ich hingewiesen habe, ist ein bisschen fortgeschrittener und Sie müssen nachschlagen, wie Ausdruck arbeiten.
public static Element[] GetById<T, Tkey>(IQueryable<T> items,Tkey[] ids)
{
var type = typeof(T);
ParameterExpression param = Expression.Parameter(type);
var list = Expression.Constant(ids);
//The names of the properties you need to get if all models have them and are named the same and are the same type this will work
var idProp = Expression.Property(param, "Id");
var descriptionProp = Expression.Property(param, "JobDescription");
var contains = typeof(Enumerable).GetMethods().First(m => m.Name == "Contains" && m.GetParameters().Count() == 2).MakeGenericMethod(typeof(Tkey));
var where = Expression.Lambda<Func<T, bool>>(Expression.Call(contains, list, idProp), param);
return (items.
Where(where).
Select(Expression.Lambda<Func<T, Element>>(
Expression.MemberInit(
Expression.New(typeof(Element)),
Expression.Bind(typeof(Element).GetProperty("Id"), idProp),
Expression.Bind(typeof(Element).GetProperty("Description"), descriptionProp)),
param))).ToArray();
}
Anruf GetById(items, new Guid[] { Guid.NewGuid() })
Warum wollen Sie einen Kontext als Parameter, und nicht eine Tabelle? Oder willst du beides? Und ich nehme an, dass all Ihre Elemente keine 'JobDescription'-Eigenschaft haben, oder? –