まず。式で作業していて、LINQをSQLで実行するとC#コードではなく、これはメモリの内容(IEnumerable)でのみ機能します。あなたはTがインタフェースまたはクラスでのIQueryableの種類ことを考えると、この
from element in MyPredicateContext
where ids.Contains(element.Id)
select new Element
{
Id = element.Id,
Description = element.JobDescription,
}
のようにそれを行う場合 あなたのクエリがSQLで動作します。 endメソッドは、この
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();
}
ようになりますなしジェネリックでそれを行うための方法がありますが、彼らはもう少し進んでいるし、維持するのは難しいだろう。
ここでは、すべてのT型で動作するメソッドであり、適切なIQueryableは良いsqlを生成します。私が指摘したように、少し高度なもので、式の動作を調べる必要があります。
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();
}
コールGetById(items, new Guid[] { Guid.NewGuid() })
は、なぜあなたは、パラメータとしてのコンテキストではなく、テーブルをしたいですか?または、両方をしたいですか?そして私はあなたのすべての要素が 'JobDescription'プロパティを持っていないと思いますか? –