エンティティタイププロパティを持たない動的LINQステートメントの作成
-
06-07-2019 - |
質問
プロパティとしてエンティティに存在する列と、エンティティのデータベースに列として存在するが存在しない列の両方をクエリするLinqステートメントを作成しようとしています。
たとえば、Bookエンティティのコレクションがあります。各ブックには、IDおよびTitleプロパティと、データベース内の一致する列があります。ただし、Bookのテーブルには Author の列フィールドも含まれており、Bookエンティティにはこれがないとします。
IDとタイトルを含む通常のクエリは次のようになります。
Books.Where(b=>b.ID == 123 && b.Title == "Title")
しかし、"に相当するものも動的に追加したい AND Author = 'Name' "上記のクエリにも。 AuthorオブジェクトはBookオブジェクトに存在しません。
追加のフィールドとそれらに含まれる値は、実際に辞書で使用できます。したがって、複数の AND [FieldName] = '[Value]' 条件をクエリに動的に追加する必要があります。
Azure Table Storageを使用し、BookエンティティをAzureに格納されたXMLに変換するシリアル化をオーバーライドしたことを知るためにこれが必要な理由の説明に役立つ場合があります。
編集-
Dynamic Linqライブラリを使用しようとしましたが、動作しません。
Books.Where(b=>b.ID == 123 && b.Title == "Title").Where("Author = @0", "SomeName").ToList();
スロー: System.Linq.Dynamic.ParseException:タイプ「Book」にプロパティまたはフィールド「Author」が存在しません。
また、
Books.AddQueryOption(" $ filter"、" Author eq 'SomeName'")の使用は、単独で使用した場合に機能することを知っています。しかし、既存のWhereステートメントと共にAddQueryOptionを使用する方法がわかりません。
解決 2
これはLINQでは不可能です
他のヒント
作成者をブックに追加せずに、作成者を含む別のオブジェクトを渡す必要があります。
var x = new { Author="SomeName" };
Books.Where(b=>b.Id == 1 && b.Title == "Alpha").Where("@1.Author == @0", "SomeName", x);
またはこの目的のためだけにBookを継承し、Authorプロパティを追加します:
public class BookEx : Book {
public string Author { get; set; }
}
Books.Cast<BookEx>().Where(b=>b.Id == 1 && b.Title== "Alpha").Where("Author == @0", "SomeName");
次のコードを試してください:
var result = _tofiObjectList.Where(o => o.GetType() == mainObjType)
.AsQueryable().Cast(relation.MainObject.EntityType).Where(relation.MainObject.Filter);
これは、 IQueryable
タイプの拡張メソッドです:
public static IQueryable Cast(this IQueryable source, string type)
{
switch (type)
{
case "TofiDataCollection.Service.TofiEntity.Obj":
return source.Cast<Obj>();
}
return source;
}