は、私は、同じ特定の条件(where
節)何回もチェックする必要があります制限されたプロジェクトを取得する。Entity Frameworkの拡張メソッドのICollectionを/のIQueryable
このチェックを関数に抽象化したいと考えました。将来、これらの条件が変わる可能性があり、すべてのLINQクエリを置き換えたくありません。
私は、次の拡張メソッドでこれをやった:
public static IQueryable<Project> IsVisibleForResearcher(this IQueryable<Project> projects, string userId)
{
return projects.Where(p => p.Type == Enums.ProjectType.Open ||
p.Invites.Any(i => i.InviteeId == userId));
}
を今私はLINQクエリを変更することができます。これは、同じSQLクエリを生成
return _ctx.Projects.Where(p => p.CompanyId == companyId)
.IsVisibleForResearcher(userId).ToList()
。今私の問題は、プロジェクトを持つ別のDbSetでこの拡張メソッドを使用したいときに始まります。
企業にはプロジェクトがあるとします。そして私は、ユーザーが少なくとも1つのプロジェクトを見ることができる会社を検索したいだけです。
return _ctx.Companies
.Where(c => c.Projects.Where(p =>
p.Type == Enums.ProjectType.Open ||
p.Invites.Any(i => i.InviteeId == userId))
.Any())
ここでも私は拡張メソッドを使いたい。
return _ctx.Companies
.Where(c => c.Projects.AsQueryable().IsVisibleForCompanyAccount(userId).Any())
これは、次の例外がスローされます。
型「System.NotSupportedException」の例外が Remotion.Linq.dllで発生したが、ユーザーコード
追加情報で処理されませんでしたでした式 'c.Projects.AsQueryable()'を解析しません:この 'System.Linq.Queryable.AsQueryable'メソッドのオーバーロードは現在サポートされていません。
public static IEnumerable<Project> IsVisibleForResearcher(this ICollection<Project> projects, string userId) { return projects.Where(p => p.Type == Enums.ProjectType.Open || p.Invites.Any(i => i.InviteeId == userId)); }
しかし、これもうまくいきませんでした:私は、次の拡張メソッドを作成したより
。
アイデアはありますか? または右方向へのステップ。ところで、私は.NETのコアに
UPDATE Entity Frameworkのコアを使用してい
:
「System.Linq.Queryable:
Expression<Func<>>
を使用しては同じ例外が発生しました。 AsQueryable 'は現在サポートされていません。
UPDATEソリューションを提供するための2
Thxを@イワン-stoev。 私はまだ1つの問題があります。私はまた、「目に見える」プロジェクトの数を取得したい。
私はこれを行うことによって、それを修正:
var companies = _ctx.Companies
.WhereAny(c => c.Projects, Project.IsProjectVisibleForResearcher(userId))
.Select(c => new CompanyListDto
{
Id = c.Id,
Name = c.Name,
LogoId = c.LogoId,
ProjectCount = _ctx.Projects.Where(p => p.CompanyId == c.Id)
.Count(Project.IsProjectVisibleForResearcher(userId))
});
しかし、私はちょうど生成されますSQLが正しいですが、私がしたい
ctx.Projects.Where(p => p.CompanyId == c.Id)
の代わりにc.Projects
を使用する方法を見つけることができません。この不要なチェックを避けるためです。敬具
、IQueryable<T>
クエリ式は、常に問題となって、一部の式ツリーの後処理を必要としている内部の表現/カスタムメソッドを使用して ブレヒト
完全に機能します。この回答をありがとうございます!良い一日を! 次回に解決策を検討するつもりで、私はこのようなものを自分で作り出すことができます。 – ErazerBrecht
まだ小さな問題があります。私は元の質問に「更新2」として投稿しました。生成されるSQLは正しいが、私はそれをやらなければならなかった。確認する義務があると感じないでください! – ErazerBrecht
チェックしても問題ありません。問題は、解決策がトップレベルのクエリ可能なもののために限られていることです(冒頭で述べたように)。あなたのアップデートのような別のメソッド( 'Where'、' Count'など)と特に 'Select'の中に入れば、あなたはもっと多くのヘルパーを必要としているでしょう。おそらく、実際にAutoMapperを投影( 'ProjectTo')および/またはLinqKit(式合成)のために見る必要があります。 –